From 72722e62d77450075fe1979836e419b9dd93786a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Didier=20Clermont=C3=A9?= Date: Tue, 14 Jan 2020 21:18:01 +0100 Subject: [PATCH 1/2] suppressed 1.2.1 --- CHANGELOG.md | 173 - CREDITS.md | 41 - INSTALL.md | 171 - LICENSE.md | 964 -- README.md | 118 - browserconfig.xml | 11 - cfg/.htaccess | 2 - cfg/conf.php | 154 - cfg/conf.php~ | 149 - cfg/conf.sample.php | 154 - css/bootstrap/bootstrap-3.3.5.css | 14 - css/bootstrap/bootstrap-theme-3.3.5.css | 5 - css/bootstrap/darkstrap-0.9.3.css | 8061 ----------------- .../fonts/glyphicons-halflings-regular.eot | Bin 20127 -> 0 bytes .../fonts/glyphicons-halflings-regular.svg | 288 - .../fonts/glyphicons-halflings-regular.ttf | Bin 45404 -> 0 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 23424 -> 0 bytes .../fonts/glyphicons-halflings-regular.woff2 | Bin 18028 -> 0 bytes css/bootstrap/privatebin.css | 146 - css/noscript.css | 15 - css/prettify/desert.css | 1 - css/prettify/doxy.css | 1 - css/prettify/prettify.css | 1 - css/prettify/sons-of-obsidian.css | 1 - css/prettify/sunburst.css | 1 - css/privatebin.css | 457 - i18n/de.json | 159 - i18n/es.json | 159 - i18n/fr.json | 168 - i18n/hu.json | 159 - i18n/it.json | 159 - i18n/languages.json | 181 - i18n/nl.json | 159 - i18n/no.json | 159 - i18n/oc.json | 168 - i18n/pl.json | 159 - i18n/pt.json | 159 - i18n/ru.json | 169 - i18n/sl.json | 168 - i18n/zh.json | 159 - img/android-chrome-192x192.png | Bin 5557 -> 0 bytes img/android-chrome-512x512.png | Bin 23065 -> 0 bytes img/apple-touch-icon.png | Bin 3967 -> 0 bytes img/busy.gif | Bin 671 -> 0 bytes img/favicon-16x16.png | Bin 469 -> 0 bytes img/favicon-32x32.png | Bin 749 -> 0 bytes img/favicon.ico | Bin 15086 -> 0 bytes img/icon.svg | 1 - img/icon_clone.png | Bin 266 -> 0 bytes img/icon_new.png | Bin 157 -> 0 bytes img/icon_qr.png | Bin 299 -> 0 bytes img/icon_raw.png | Bin 183 -> 0 bytes img/icon_send.png | Bin 209 -> 0 bytes img/icon_shorten.png | Bin 196 -> 0 bytes img/logo.svg | 1 - img/mstile-144x144.png | Bin 3644 -> 0 bytes img/mstile-150x150.png | Bin 3284 -> 0 bytes img/mstile-310x150.png | Bin 3580 -> 0 bytes img/mstile-310x310.png | Bin 9220 -> 0 bytes img/mstile-70x70.png | Bin 2424 -> 0 bytes img/safari-pinned-tab.svg | 1 - index.php | 18 - js/base64-1.7.js | 237 - js/base64-2.4.5.js | 1 - js/bootstrap-3.3.7.js | 7 - js/comment.jsonld | 16 - js/commentmeta.jsonld | 8 - js/common.js | 160 - js/jquery-3.3.1.js | 2 - js/kjua-0.1.2.js | 2 - js/paste.jsonld | 24 - js/pastemeta.jsonld | 11 - js/prettify.js | 30 - js/privatebin.js | 4456 --------- js/purify-1.0.7.js | 1 - js/rawdeflate-0.5.js | 1675 ---- js/rawinflate-0.3.js | 755 -- js/showdown-1.8.6.js | 2 - js/sjcl-1.0.7.js | 60 - lib/.htaccess | 1 - lib/Configuration.php | 262 - lib/Controller.php | 481 - lib/Data/AbstractData.php | 183 - lib/Data/Database.php | 705 -- lib/Data/Filesystem.php | 373 - lib/Filter.php | 90 - lib/I18n.php | 388 - lib/Json.php | 48 - lib/Model.php | 90 - lib/Model/AbstractModel.php | 164 - lib/Model/Comment.php | 213 - lib/Model/Paste.php | 328 - lib/Persistence/AbstractPersistence.php | 125 - lib/Persistence/DataStore.php | 89 - lib/Persistence/PurgeLimiter.php | 87 - lib/Persistence/ServerSalt.php | 104 - lib/Persistence/TrafficLimiter.php | 134 - lib/Request.php | 245 - lib/Sjcl.php | 103 - lib/View.php | 61 - lib/Vizhash16x16.php | 233 - manifest.json | 17 - robots.txt | 9 - tpl/.htaccess | 1 - tpl/bootstrap.php | 535 -- tpl/page.php | 259 - vendor/.htaccess | 1 - vendor/autoload.php | 7 - vendor/composer/ClassLoader.php | 445 - vendor/composer/autoload_classmap.php | 35 - vendor/composer/autoload_files.php | 10 - vendor/composer/autoload_namespaces.php | 10 - vendor/composer/autoload_psr4.php | 10 - vendor/composer/autoload_real.php | 70 - vendor/composer/autoload_static.php | 76 - .../random_compat/lib/byte_safe_strings.php | 181 - .../random_compat/lib/cast_to_int.php | 75 - .../random_compat/lib/error_polyfill.php | 49 - vendor/paragonie/random_compat/lib/random.php | 226 - .../lib/random_bytes_com_dotnet.php | 88 - .../lib/random_bytes_dev_urandom.php | 167 - .../lib/random_bytes_libsodium.php | 88 - .../lib/random_bytes_libsodium_legacy.php | 92 - .../random_compat/lib/random_bytes_mcrypt.php | 77 - .../random_compat/lib/random_int.php | 190 - .../random_compat/other/build_phar.php | 57 - .../random_compat/psalm-autoload.php | 9 - .../src/Identicon/Generator/BaseGenerator.php | 241 - .../src/Identicon/Generator/GdGenerator.php | 76 - .../Generator/GeneratorInterface.php | 33 - .../Generator/ImageMagickGenerator.php | 80 - .../identicon/src/Identicon/Identicon.php | 100 - vendor/yzalis/identicon/src/autoload.php | 30 - 133 files changed, 28532 deletions(-) delete mode 100644 CHANGELOG.md delete mode 100644 CREDITS.md delete mode 100644 INSTALL.md delete mode 100644 LICENSE.md delete mode 100644 README.md delete mode 100644 browserconfig.xml delete mode 100644 cfg/.htaccess delete mode 100644 cfg/conf.php delete mode 100644 cfg/conf.php~ delete mode 100644 cfg/conf.sample.php delete mode 100644 css/bootstrap/bootstrap-3.3.5.css delete mode 100644 css/bootstrap/bootstrap-theme-3.3.5.css delete mode 100644 css/bootstrap/darkstrap-0.9.3.css delete mode 100644 css/bootstrap/fonts/glyphicons-halflings-regular.eot delete mode 100644 css/bootstrap/fonts/glyphicons-halflings-regular.svg delete mode 100644 css/bootstrap/fonts/glyphicons-halflings-regular.ttf delete mode 100644 css/bootstrap/fonts/glyphicons-halflings-regular.woff delete mode 100644 css/bootstrap/fonts/glyphicons-halflings-regular.woff2 delete mode 100644 css/bootstrap/privatebin.css delete mode 100644 css/noscript.css delete mode 100644 css/prettify/desert.css delete mode 100644 css/prettify/doxy.css delete mode 100644 css/prettify/prettify.css delete mode 100644 css/prettify/sons-of-obsidian.css delete mode 100644 css/prettify/sunburst.css delete mode 100644 css/privatebin.css delete mode 100644 i18n/de.json delete mode 100644 i18n/es.json delete mode 100644 i18n/fr.json delete mode 100644 i18n/hu.json delete mode 100644 i18n/it.json delete mode 100644 i18n/languages.json delete mode 100644 i18n/nl.json delete mode 100644 i18n/no.json delete mode 100644 i18n/oc.json delete mode 100644 i18n/pl.json delete mode 100644 i18n/pt.json delete mode 100644 i18n/ru.json delete mode 100644 i18n/sl.json delete mode 100644 i18n/zh.json delete mode 100644 img/android-chrome-192x192.png delete mode 100644 img/android-chrome-512x512.png delete mode 100644 img/apple-touch-icon.png delete mode 100644 img/busy.gif delete mode 100644 img/favicon-16x16.png delete mode 100644 img/favicon-32x32.png delete mode 100644 img/favicon.ico delete mode 100644 img/icon.svg delete mode 100644 img/icon_clone.png delete mode 100644 img/icon_new.png delete mode 100644 img/icon_qr.png delete mode 100644 img/icon_raw.png delete mode 100644 img/icon_send.png delete mode 100644 img/icon_shorten.png delete mode 100644 img/logo.svg delete mode 100644 img/mstile-144x144.png delete mode 100644 img/mstile-150x150.png delete mode 100644 img/mstile-310x150.png delete mode 100644 img/mstile-310x310.png delete mode 100644 img/mstile-70x70.png delete mode 100644 img/safari-pinned-tab.svg delete mode 100644 index.php delete mode 100644 js/base64-1.7.js delete mode 100644 js/base64-2.4.5.js delete mode 100644 js/bootstrap-3.3.7.js delete mode 100644 js/comment.jsonld delete mode 100644 js/commentmeta.jsonld delete mode 100644 js/common.js delete mode 100644 js/jquery-3.3.1.js delete mode 100644 js/kjua-0.1.2.js delete mode 100644 js/paste.jsonld delete mode 100644 js/pastemeta.jsonld delete mode 100644 js/prettify.js delete mode 100644 js/privatebin.js delete mode 100644 js/purify-1.0.7.js delete mode 100644 js/rawdeflate-0.5.js delete mode 100644 js/rawinflate-0.3.js delete mode 100644 js/showdown-1.8.6.js delete mode 100644 js/sjcl-1.0.7.js delete mode 100644 lib/.htaccess delete mode 100644 lib/Configuration.php delete mode 100644 lib/Controller.php delete mode 100644 lib/Data/AbstractData.php delete mode 100644 lib/Data/Database.php delete mode 100644 lib/Data/Filesystem.php delete mode 100644 lib/Filter.php delete mode 100644 lib/I18n.php delete mode 100644 lib/Json.php delete mode 100644 lib/Model.php delete mode 100644 lib/Model/AbstractModel.php delete mode 100644 lib/Model/Comment.php delete mode 100644 lib/Model/Paste.php delete mode 100644 lib/Persistence/AbstractPersistence.php delete mode 100644 lib/Persistence/DataStore.php delete mode 100644 lib/Persistence/PurgeLimiter.php delete mode 100644 lib/Persistence/ServerSalt.php delete mode 100644 lib/Persistence/TrafficLimiter.php delete mode 100644 lib/Request.php delete mode 100644 lib/Sjcl.php delete mode 100644 lib/View.php delete mode 100644 lib/Vizhash16x16.php delete mode 100644 manifest.json delete mode 100644 robots.txt delete mode 100644 tpl/.htaccess delete mode 100644 tpl/bootstrap.php delete mode 100644 tpl/page.php delete mode 100644 vendor/.htaccess delete mode 100644 vendor/autoload.php delete mode 100644 vendor/composer/ClassLoader.php delete mode 100644 vendor/composer/autoload_classmap.php delete mode 100644 vendor/composer/autoload_files.php delete mode 100644 vendor/composer/autoload_namespaces.php delete mode 100644 vendor/composer/autoload_psr4.php delete mode 100644 vendor/composer/autoload_real.php delete mode 100644 vendor/composer/autoload_static.php delete mode 100644 vendor/paragonie/random_compat/lib/byte_safe_strings.php delete mode 100644 vendor/paragonie/random_compat/lib/cast_to_int.php delete mode 100644 vendor/paragonie/random_compat/lib/error_polyfill.php delete mode 100644 vendor/paragonie/random_compat/lib/random.php delete mode 100644 vendor/paragonie/random_compat/lib/random_bytes_com_dotnet.php delete mode 100644 vendor/paragonie/random_compat/lib/random_bytes_dev_urandom.php delete mode 100644 vendor/paragonie/random_compat/lib/random_bytes_libsodium.php delete mode 100644 vendor/paragonie/random_compat/lib/random_bytes_libsodium_legacy.php delete mode 100644 vendor/paragonie/random_compat/lib/random_bytes_mcrypt.php delete mode 100644 vendor/paragonie/random_compat/lib/random_int.php delete mode 100644 vendor/paragonie/random_compat/other/build_phar.php delete mode 100644 vendor/paragonie/random_compat/psalm-autoload.php delete mode 100644 vendor/yzalis/identicon/src/Identicon/Generator/BaseGenerator.php delete mode 100644 vendor/yzalis/identicon/src/Identicon/Generator/GdGenerator.php delete mode 100644 vendor/yzalis/identicon/src/Identicon/Generator/GeneratorInterface.php delete mode 100644 vendor/yzalis/identicon/src/Identicon/Generator/ImageMagickGenerator.php delete mode 100644 vendor/yzalis/identicon/src/Identicon/Identicon.php delete mode 100644 vendor/yzalis/identicon/src/autoload.php diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index 6f46df79..00000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,173 +0,0 @@ -# PrivateBin version history - - * **1.3 (not yet released)** - * **1.2.1 (2018-08-11)** - * ADDED: Add support for mega.nz links in pastes and comments (#331) - * CHANGED: Added some missing Russian translations (#348) - * CHANGED: Minor PHP refactoring: Rename PrivateBin class to Controller, improved logic of some persistence classes (#342) - * CHANGED: Upgrading DOMpurify library to 1.0.7 - * FIXED: Ensure legacy browsers without webcrypto support can't create paste keys with insufficient entropy (#346) - * FIXED: Re-add support for old browsers (Firefox<21, Chrome<31, Safari<7, IE<11), broken in 1.2, will be removed again in 1.3 - * **1.2 (2018-07-22)** - * ADDED: Translations for Spanish, Occitan, Norwegian, Portuguese, Dutch and Hungarian - * ADDED: Option in configuration to change the default "PrivateBin" title of the site - * ADDED: Added display of video, audio & PDF, drag & drop, preview of attachments (#182) - * ADDED: QR code generation (#169) - * ADDED: Introduced DOMpurify library to sanitize generated HTML before display (#183) - * CHANGED: Force JSON request for getting paste data & password retry (#216) - * CHANGED: Minimum required PHP version is 5.4 (#186) - * CHANGED: Shipped .htaccess files were updated for Apache 2.4 (#192) - * CHANGED: Cleanup of bootstrap template variants and moved icons to `img` directory - * CHANGED: Removed option to hide clone button on expiring pastes, since this requires reading the paste for rendering the template, which leaks information on the pastes state - * CHANGED: Upgrading libraries to: SJCL 1.0.7, jQuery 3.3.1, Base64 2.4.5, Showdown 1.8.6, DOMpurify 1.0.5 & Prettify 453bd5f - * CHANGED: Refactored JavaScript code, making it modular with private and public functions, making it much easier to maintain (#178) - * FIXED: To counteract regressions introduced by the refactoring, we finally introduced property based unit testing for the JavaScript code, this caught several regressions, but also some very old bugs not found so far (#32) - * **1.1.1 (2017-10-06)** - * CHANGED: Switched to `.php` file extension for configuration file, to avoid leaking configuration data in unprotected installation. - * **1.1 (2016-12-26)** - * ADDED: Translations for Italian and Russian - * ADDED: Loading message displayed until decryption succeeded for slower (in terms of CPU or network) systems - * ADDED: Dockerfile for docker container creation - * CHANGED: Using modal dialog to request password input instead of native JS input window (#69) - * CHANGED: Suppressed referrer HTTP header sending when following links in a paste or comment (#96) and added additional HTTP headers for XSS mitigation (#91) - * CHANGED: Updated random_compat and jQuery libraries - * FIXED: XSS using JavaScript stored as markdown formatted paste, after clicking on Raw paste button (#137) - * FIXED: Automatic purging deleting non-expiring pastes, when using database store (#149) - * **1.0 (2016-08-25)** - * ADDED: Translations for Slowene and Chinese - * ADDED: re-introduced (optional) URL shortener support, which was removed back in version 0.16 for privacy concerns - * ADDED: Preview tab, helpful for writing markdown code or check the source code rendering - * ADDED: Automatic purging of expired pastes, done on paste creation - * ADDED: Option to disable icons in discussions (will only affect newly created pastes) - * ADDED: Composer support - * CHANGED: Renamed the ZeroBin fork to PrivateBin - * CHANGED: Removed unmaintained RainTPL template engine, replacing the templates with straight forward PHP files - * CHANGED: New logo and favicons - * CHANGED: Upgrading SJCL library to 1.0.4 - * CHANGED: Switched to GCM instead of CCM mode for AES encryption for newly created pastes - * CHANGED: Use backported random bytes function from PHP7 for older PHP versions instead of mcrypt - * CHANGED: Switched to a SHA256 HMAC of the IP in traffic limiter instead of storing it in plain text on the server - * CHANGED: Introduced content security policy header to reduce cross site scripting (XSS) risks - * CHANGED: Added SHA512 subresource integrity hashes for all javascript includes to reduce the risk of manipulated scripts and easier detection of such - * CHANGED: Refactored PHP code to conform to PSR-4 and PSR-2 standards - * CHANGED: Switched to Identicons as the default for comments with nicknames - * CHANGED: Vizhash is now optional and based on (128 byte) SHA512 HMAC instead of (144 byte) combination of MD5, SHA1 and a reversal of that string - * FIXED: Content-type negociation for HTML in certain uncommon browser configurations - * FIXED: JavaScript error displayed before page is loaded or during attachment load - * FIXED: Don't strip space characters at beginning or end of optional password - * FIXED: Various UI glitches in mobile version or on smaller desktops with language menu, button spacing and long URLs - * FIXED: Back button now works as expected after switching to raw text view of a paste - * FIXED: Reactivated second error message above send comment button to ensure its visibility when the main error message is outside the viewport - * FIXED: Raw text now displays original markdown instead of rendered HTML - * FIXED: Removed unused code detected with the help of various code review tools - * FIXED: Table format for PostgreSQL, making it possible to use PostgreSQL as backend in addition to MySQL, SQLite and flat files - * **0.22 (2015-11-09)**: - * ADDED: Tab character input support - * ADDED: Dark bootstrap theme - * ADDED: Option to hide clone button on expiring pastes - * ADDED: Option to set a different default language then English and/or enforce it as the only language - * ADDED: Database now contains version to allow automatic update of structure, only if necessary; removing database structure check on each request - * ADDED: Favicons - * FIXING: Regressions in database layer, prohibiting pastes from being stored - * FIXING: Fixing "missing" comments when they were posted during the same second to the same paste - * FIXING: JS failing when password input disabled - * CHANGED: Switching positions of "New" and "Send" button, highlighting the latter to improve workflow - * CHANGED: Renamed config file to make updates easier - * CHANGED: Switching to JSON-based REST-API - * CHANGED: Database structure to store attachments, allowing larger attachments to be stored (depending on maximum BLOB size of database backend) - * CHANGED: Refactored data model, traffic limiting & request handling - * **0.21.1 (2015-09-21)**: - * FIXING: lost meta data when using DB model instead of flat files - * FIXING: mobile navbar getting triggered on load - * CHANGED: database table "paste" gets automatically extended with a "meta" column - * CHANGED: navbar of "bootstrap" template now spans full width of view port on large screens - * **0.21 (2015-09-19)**: - * ADDED: Translations for German, French and Polish, language selection menu (optional) - * ADDED: File upload and image display support (optional) - * ADDED: Markdown format support - * ADDED: "bootstrap-compact" template that hides some of the options in a drop down menu to ensure the nav bar fitting on one line on smaller screen sizes - * FIXING: Various usability issues with different screen sizes / device types in the "bootstrap" template - * CHANGED: Instead of having different options to enable and preselect certain formats there is now a generic `[formatter_options]` section where formats can be added to the displayed format drop down menu. A `defaultformatter` can be set, it defaults to "plaintext". The `syntaxhighlighting` configuration got deprecated. - * `zerobin.js` got a major refactoring: - * moved from global namespace into anonymous function - * events are no longer set via "onclick" attributes in the templates, but bound by from JS side - * for simpler maintenance the functions were grouped into objects: zerobin (display logic, event handling), filter (compression, -encryption), i18n (translation, counterpart of i18n.php) and helper (stateless utilities) - * Wiki pages were added to address common topics: - * [Upgrading from ZeroBin 0.19 Alpha](https://github.com/PrivateBin/PrivateBin/wiki/Upgrading-from-ZeroBin-0.19-Alpha) - * [Directory of public PrivateBin servers](https://github.com/PrivateBin/PrivateBin/wiki/PrivateBin-Directory) - * [Translation](https://github.com/PrivateBin/PrivateBin/wiki/Translation) - * [Templates](https://github.com/PrivateBin/PrivateBin/wiki/Templates) - * **0.20 (2015-09-03)**: - * ADDED: Password protected pastes (optional) - * ADDED: configuration options for highlighting, password, discussions, expiration times, rate limiting - * ADDED: JSON-only retrieval of paste incl. discussion, used to be able to refresh paste when posting a comment - * ADDED: bootstrap CSS based template - * CHANGED: "Burn after reading" pastes are now deleted only after the paste was successfully decrypted via callback. This prevents accidental deletion by chatbots following URLs and the like. Usage of a password is suggested to ensure only the desired recipient is able to encrypt it. - * CHANGED: the "opendiscussion" option now only controls if the discussion checkbox is preselected. Use "discussion = false" to disable the discussion feature completely (which also removes the checkbox from the template). - * FIXING: Behaviour of several conflicting configuration options. As a general measure unit tests for 9 of the options and all their possible configurations were added via a unit test generator. - * updated JS libraries: jquery to 1.11.3, sjcl to 1.0.2, base64.js to 2.1.9, deflate to 0.5, inflate to 0.3 and prettify to latest - * generally improved documentation, both inline phpdoc / JSdoc source code documentation, as well as Wiki pages on installation, configuration, development and JSON-API - * **Alpha 0.19 (2013-07-05)**: - * Corrected XSS security flaw which affected IE<10. Other browsers were not affected. - * Corrected spacing display in IE<10. - * **Alpha 0.18 (2013-02-24)**: - * ADDED: The resulting URL is automatically selected after pressing "Send". You just have to press CTRL+C. - * ADDED: Automatic syntax highlighting for 53 languages using highlight.js - * ADDED: "5 minutes" and "1 week" expirations. - * ADDED: "Raw text" button. - * jQuery upgraded to 1.9.1 - * sjcl upgraded to GitHub master 2013-02-23 - * base64.js upgraded to 1.7 - * FIXED: Dates in discussion are now proper local dates. - * ADDED: Robot meta tags in HTML to prevent search engines indexing. - * ADDED: Better json checking (including entropy). - * ADDED: Added version to js/css assets URLs in order to prevent some abusive caches to serve an obsolete version of these files when ZeroBin is upgraded. - * "Burn after reading" option has been moved out of Expiration combo to a separate checkbox. Reason is: You can prevent a read-once paste to be available ad vitam eternam on the net. - * **Alpha 0.17 (2013-02-23)**: - * ADDED: Deletion URL. - * small refactoring. - * improved regex checks. - * larger server alt on installation. - * **Alpha 0.16**: - * FIXED minor php warnings. - * FIXED: zerobin.js reformated and properly commented. - * FIXED: Directory structure re-organized. - * CHANGED: URL shortening button was removed. (It was bad for privacy.) - * **Alpha 0.15 (2012-04-20):** - * FIXED: 2 minor corrections to avoid notices in php log. - * FIXED: Sources converted to UTF-8. - * **Alpha 0.14 (2012-04-20):** - * ADDED: GD presence is checked. - * CHANGED: Traffic limiter data files moved to data/ (→easier rights management) - * ADDED: "Burn after reading" implemented. Opening the URL will display the paste and immediately destroy it on server. - * **Alpha 0.13 (2012-04-18):** - * FIXED: ''imageantialias()'' call removed because it's not really usefull and can be a problem on most hosts (if GD is not compiled in php). - * FIXED: $error not properly initialized in index.php - * **Alpha 0.12 (2012-04-18):** - * **DISCUSSIONS !** Now you can enable discussions on your pastes. Of course, posted comments and nickname are also encrypted and the server cannot see them. - * This feature implies a change in storage format. You will have to delete all previous pastes in your ZeroBin. - * Added [[php:vizhash_gd|Vizhash]] as avatars, so you can match posters IP addresses without revealing them. (Same image = same IP). Of course the IP address cannot be deduced from the Vizhash. - * Remaining time before expiration is now displayed. - * Explicit tags were added to CSS and jQuery selectors (eg. div#aaa instead of #aaa) to speed up browser. - * Better cleaning of the URL (to make sure the key is not broken by some stupid redirection service) - * **Alpha 0.11 (2012-04-12):** - * Automatically ignore parameters (such as &utm_source=...) added //after// the anchor by some stupid Web 2.0 services. - * First public release. - * **Alpha 0.10 (2012-04-12):** - * IE9 does not seem to correctly support ''pre-wrap'' either. Special handling mode activated for all version of IE<10. (Note: **ALL other browsers** correctly support this feature.) - * **Alpha 0.9 (2012-04-11):** - * Oh bummer... IE 8 is as shitty as IE6/7: Its does not seem to support ''white-space:pre-wrap'' correctly. I had to activate the special handling mode. I still have to test IE 9. - * **Alpha 0.8 (2012-04-11):** - * Source code not published yet. - * Interface completely redesigned. Icons added. - * Now properly supports IE6/7 (ugly display, but it works. "Clone" button is disabled though.) - * Added one level of depth for storage directories (This is better for higher load servers). - * php version is now checked (min: 5.2.6) - * Better checks on posted json data on server. - * Added "1 year" expiration. - * URLs are now converted to clickable links. This include http, https, ftp and magnet links. - * Clickable links include ''rel="nofollow"'' to discourage SEO. - * On my public service (http://sebsauvage.net/paste/) - * All data will be deleted (you were warned - this is a test service) - * Default paste expiration is now 1 month to prevent clogging-up my host. diff --git a/CREDITS.md b/CREDITS.md deleted file mode 100644 index 31ede3e4..00000000 --- a/CREDITS.md +++ /dev/null @@ -1,41 +0,0 @@ -# Credits - -## Active contributors - -Simon Rupf - current developer and maintainer -rugk - security review, doc improvment, JS refactoring & various other stuff - -## Past contributions - -Sébastien Sauvage - original idea and main developer - -* Alexey Gladkov - syntax highlighting -* Greg Knaddison - robots.txt -* MrKooky - HTML5 markup, CSS cleanup -* Simon Rupf - MVC refactoring, configuration, i18n and unit tests -* Hexalyse - Password protection -* Viktor Stanchev - File upload support -* azlux - Tab character input support -* Adam Fisher - old Favicons -* rugk - new logo/icons -* Sobak - PSR-4 and PSR-2 refactoring -* Nathaniel Olsen - jQuery upgrade -* Alexander Demenshin - modal password dialog -* PunKeel - Dockerfile -* thororm - Display of video, audio & PDF, drag & drop, preview of attachments - -## Translations -* Hexalyse - French -* Kuba Niewiarowski - Polish -* Gabbalo - German -* Draky50110 - French -* Filip Muki Dobranić - Slovene -* Jiawei Zhou - Chinese -* Stefano Marty - Italian -* R4SAS - Russian -* Alfredo Fabián Altamirano Tena - Spanish -* Quent-in - Occitan -* idarlund - Norwegian -* Tulio Leao - Portuguese -* Michael van Schaik - Dutch -* Péter Tabajdi - Hungarian diff --git a/INSTALL.md b/INSTALL.md deleted file mode 100644 index 0ea1459d..00000000 --- a/INSTALL.md +++ /dev/null @@ -1,171 +0,0 @@ -# Installation - -**TL;DR:** Download the -[latest release archive](https://github.com/PrivateBin/PrivateBin/releases/latest) -and extract it in your web hosts folder where you want to install your PrivateBin -instance. We try to provide a mostly safe default configuration, but we urge you to -check the [security section](#hardening-and-security) below and the [configuration -options](#configuration) to adjust as you see fit. - -**NOTE:** See [our FAQ](https://github.com/PrivateBin/PrivateBin/wiki/FAQ#how-can-i-securely-clonedownload-your-project) for information how to securely download the PrivateBin release files. - -### Minimal requirements - -- PHP version 5.4 or above -- _one_ of the following sources of cryptographically safe randomness is required: - - PHP 7 or higher - - [Libsodium](https://download.libsodium.org/libsodium/content/installation/) and it's [PHP extension](https://paragonie.com/book/pecl-libsodium/read/00-intro.md#installing-libsodium) - - open_basedir access to `/dev/urandom` - - mcrypt extension - - com_dotnet extension - - Mcrypt needs to be able to access `/dev/urandom`. This means if `open_basedir` is set, it must include this file. -- GD extension -- some disk space or (optionally) a database supported by [PDO](https://secure.php.net/manual/book.pdo.php) -- ability to create files and folders in the installation directory and the PATH defined in index.php -- A web browser with javascript support - -## Hardening and security - -### Changing the path - -In the index.php you can define a different `PATH`. This is useful to secure your -installation. You can move the configuration, data files, templates and PHP -libraries (directories cfg, doc, data, lib, tpl, tst and vendor) outside of your -document root. This new location must still be accessible to your webserver / PHP -process (see also -[open_basedir setting](https://secure.php.net/manual/en/ini.core.php#ini.open-basedir)). - -> #### PATH Example -> Your PrivateBin installation lives in a subfolder called "paste" inside of -> your document root. The URL looks like this: -> http://example.com/paste/ -> -> The full path of PrivateBin on your webserver is: -> /home/example.com/htdocs/paste -> -> When setting the path like this: -> define('PATH', '../../secret/privatebin/'); -> -> PrivateBin will look for your includes / data here: -> /home/example.com/secret/privatebin - -### Transport security - -When setting up PrivateBin, also set up HTTPS, if you haven't already. Without HTTPS -PrivateBin is not secure, as the javascript files could be manipulated during transmission. -For more information on this, see our [FAQ entry on HTTPS setup](https://github.com/PrivateBin/PrivateBin/wiki/FAQ#how-should-i-setup-https). - -### File-level permissions - -After completing the installation, you should make sure, other users on the system cannot read the config file or the `data/` directory, as – depending on your configuration – potential secret information are saved there. - -See [this FAQ item](https://github.com/PrivateBin/PrivateBin/wiki/FAQ#what-are-the-recommended-file-and-folder-permissions-for-privatebin) for a detailed guide on how to "harden" the permissions of files and folders. - -## Configuration - -In the file `cfg/conf.php` you can configure PrivateBin. A `cfg/conf.sample.php` -is provided containing all options and default values. You can copy it to -`cfg/conf.php` and adapt it as needed. The config file is divided into multiple -sections, which are enclosed in square brackets. - -In the `[main]` section you can enable or disable the discussion feature, set -the limit of stored pastes and comments in bytes. The `[traffic]` section lets -you set a time limit in seconds. Users may not post more often then this limit -to your PrivateBin installation. - -More details can be found in the -[configuration documentation](https://github.com/PrivateBin/PrivateBin/wiki/Configuration). - -## Advanced installation - -### Web server configuration - -A `robots.txt` file is provided in the root dir of PrivateBin. It disallows all -robots from accessing your pastes. It is recommend to place it into the root of -your web directory if you have installed PrivateBin in a subdirectory. Make sure -to adjust it, so that the file paths match your installation. Of course also -adjust the file if you already use a `robots.txt`. - -A `.htaccess.disabled` file is provided in the root dir of PrivateBin. It blocks -some known robots and link-scanning bots. If you use Apache, you can rename the -file to `.htaccess` to enable this feature. If you use another webserver, you -have to configure it manually to do the same. - -### When using Cloudflare - -If you want to use PrivateBin behind Cloudflare, make sure you have disabled the Rocket -loader and unchecked "Javascript" for Auto Minify, found in your domain settings, -under "Speed". (More information -[in this FAQ entry](https://github.com/PrivateBin/PrivateBin/wiki/FAQ#user-content-how-to-make-privatebin-work-when-using-cloudflare-for-ddos-protection)) - -### Using a database instead of flat files - -In the configuration file the `[model]` and `[model_options]` sections let you -configure your favourite way of storing the pastes and discussions on your -server. - -`Filesystem` is the default model, which stores everything in files in the -data folder. This is the recommended setup for most sites. - -Under high load, in distributed setups or if you are not allowed to store files -locally, you might want to switch to the `Database` model. This lets you -store your data in a database. Basically all databases that are supported by -[PDO](https://secure.php.net/manual/en/book.pdo.php) may be used. Automatic table -creation is provided for `pdo_ibm`, `pdo_informix`, `pdo_mssql`, `pdo_mysql`, -`pdo_oci`, `pdo_pgsql` and `pdo_sqlite`. You may want to provide a table prefix, -if you have to share the PrivateBin database with another application or you want -to use a prefix for -[security reasons](https://security.stackexchange.com/questions/119510/is-using-a-db-prefix-for-tables-more-secure). -The table prefix option is called `tbl`. - -> #### Note -> The `Database` model has only been tested with SQLite, MySQL and PostgreSQL, -> although it would not be recommended to use SQLite in a production environment. -> If you gain any experience running PrivateBin on other RDBMS, please let us -> know. - -The following GRANTs (privileges) are required for the PrivateBin user in **MySQL**. In normal operation: -- INSERT, SELECT, DELETE on the paste and comment tables -- SELECT on the config table - -If you want PrivateBin to handle table creation (when you create the first paste) and updates (after you update PrivateBin to a new release), you need to give the user these additional privileges: -- CREATE, INDEX and ALTER on the database -- INSERT and UPDATE on the config table - -For reference or if you want to create the table schema for yourself to avoid having to give PrivateBin too many permissions (replace -`prefix_` with your own table prefix and create the table schema with your favourite MySQL console): - -```sql -CREATE TABLE prefix_paste ( - dataid CHAR(16) NOT NULL, - data BLOB, - postdate INT, - expiredate INT, - opendiscussion INT, - burnafterreading INT, - meta TEXT, - attachment MEDIUMBLOB, - attachmentname BLOB, - PRIMARY KEY (dataid) -); - -CREATE TABLE prefix_comment ( - dataid CHAR(16), - pasteid CHAR(16), - parentid CHAR(16), - data BLOB, - nickname BLOB, - vizhash BLOB, - postdate INT, - PRIMARY KEY (dataid) -); -CREATE INDEX parent ON prefix_comment(pasteid); - -CREATE TABLE prefix_config ( - id CHAR(16) NOT NULL, value TEXT, PRIMARY KEY (id) -); -INSERT INTO prefix_config VALUES('VERSION', '1.2.1'); -``` - -In **PostgreSQL**, the data, attachment, nickname and vizhash columns needs to be TEXT and not BLOB or MEDIUMBLOB. diff --git a/LICENSE.md b/LICENSE.md deleted file mode 100644 index 8492fc32..00000000 --- a/LICENSE.md +++ /dev/null @@ -1,964 +0,0 @@ -# License - -PrivateBin consists of PHP and JS code which was originally written by Sébastien -Sauvage in 2012 and falls unter the Zlib/libpng license. Also included are -libraries that fall under the GPLv2 (SJCL, rawinflate, rawdeflate), BSD -2-clause (SJCL), BSD 3-clause (base64.js version 2.1.9, Showdown), MIT -(base64.js version 1.7, Bootstrap, Identicon, random_compat), Apache -(prettify.js) and CC-BY (favicon, icon, logo) licenses. All of these license -terms can be found here below: - -## Zlib/libpng license for PrivateBin - -Copyright © 2012 Sébastien Sauvage - -This software is provided 'as-is', without any express or implied warranty. In -no event will the authors be held liable for any damages arising from the use -of this software. - -Permission is granted to anyone to use this software for any purpose, including -commercial applications, and to alter it and redistribute it freely, subject to -the following restrictions: - -1. The origin of this software must not be misrepresented; you must not claim - that you wrote the original software. If you use this software in a product, - an acknowledgment in the product documentation would be appreciated but is - not required. - -2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - -3. This notice may not be removed or altered from any source distribution. - -### MIT license for kjua - -Copyright (c) 2016 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. - -## GNU General Public License, version 2.0, for SJCL, rawdeflate and rawinflate - -_Version 2, June 1991_ -_Copyright © 1989, 1991 Free Software Foundation, Inc.,_ -_51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA_ - -Everyone is permitted to copy and distribute verbatim copies -of this license document, but changing it is not allowed. - -### Preamble - -The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - -When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - -To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - -For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - -We protect your rights with two steps: **(1)** copyright the software, and -**(2)** offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - -Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - -Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - -The precise terms and conditions for copying, distribution and -modification follow. - -### TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - -**0.** This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The “Program”, below, -refers to any such program or work, and a “work based on the Program” -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term “modification”.) Each licensee is addressed as “you”. - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - -**1.** You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - -**2.** You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - -* **a)** You must cause the modified files to carry prominent notices -stating that you changed the files and the date of any change. -* **b)** You must cause any work that you distribute or publish, that in -whole or in part contains or is derived from the Program or any -part thereof, to be licensed as a whole at no charge to all third -parties under the terms of this License. -* **c)** If the modified program normally reads commands interactively -when run, you must cause it, when started running for such -interactive use in the most ordinary way, to print or display an -announcement including an appropriate copyright notice and a -notice that there is no warranty (or else, saying that you provide -a warranty) and that users may redistribute the program under -these conditions, and telling the user how to view a copy of this -License. (Exception: if the Program itself is interactive but -does not normally print such an announcement, your work based on -the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - -**3.** You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - -* **a)** Accompany it with the complete corresponding machine-readable -source code, which must be distributed under the terms of Sections -1 and 2 above on a medium customarily used for software interchange; or, -* **b)** Accompany it with a written offer, valid for at least three -years, to give any third party, for a charge no more than your -cost of physically performing source distribution, a complete -machine-readable copy of the corresponding source code, to be -distributed under the terms of Sections 1 and 2 above on a medium -customarily used for software interchange; or, -* **c)** Accompany it with the information you received as to the offer -to distribute corresponding source code. (This alternative is -allowed only for noncommercial distribution and only if you -received the program in object code or executable form with such -an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - -**4.** You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - -**5.** You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - -**6.** Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - -**7.** If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - -**8.** If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - -**9.** The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and “any -later version”, you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - -**10.** If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - -### NO WARRANTY - -**11.** BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - -**12.** IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - -END OF TERMS AND CONDITIONS - -## BSD 2-Clause License for SJCL - -_Copyright © 2009-2015, Emily Stark, Mike Hamburg and Dan Boneh at Stanford University._ -_All rights reserved._ - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -## BSD 3-Clause License for Showdown - -Showdown Copyright © 2007, John Fraser - -All rights reserved. - -Original Markdown copyright © 2004, John Gruber - -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -* Neither the name "Markdown" nor the names of its contributors may be used - to endorse or promote products derived from this software without specific - prior written permission. - -This software is provided by the copyright holders and contributors "as is" and -any express or implied warranties, including, but not limited to, the implied -warranties of merchantability and fitness for a particular purpose are -disclaimed. In no event shall the copyright owner or contributors be liable for -any direct, indirect, incidental, special, exemplary, or consequential damages -(including, but not limited to, procurement of substitute goods or services; -loss of use, data, or profits; or business interruption) however caused and on -any theory of liability, whether in contract, strict liability, or tort -(including negligence or otherwise) arising in any way out of the use of this -software, even if advised of the possibility of such damage. - -## BSD 3-Clause License for base64.js version 2.1.9 - -Copyright © 2014, Dan Kogai -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -* Neither the name of base64.js nor the names of its contributors may be used - to endorse or promote products derived from this software without specific - prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -## MIT License for base64.js version 1.7 - -Copyright © 2012 Dan Kogai - -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. - -## MIT License for Bootstrap - -Copyright © 2011-2016 Twitter, Inc. - -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. - -## MIT License for Identicon - -Copyright © 2013 Benjamin Laugueux - -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. - -## MIT License for random_compat - -Copyright © 2015 Paragon Initiative Enterprises - -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. - -## MIT license for Composer - -Copyright (c) 2016 Nils Adermann, Jordi Boggiano - -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. - -## Apache License for prettify.js - -_Version 2.0, January 2004_ -__ - -### Terms and Conditions for use, reproduction, and distribution - -#### 1. Definitions - -“License” shall mean the terms and conditions for use, reproduction, and -distribution as defined by Sections 1 through 9 of this document. - -“Licensor” shall mean the copyright owner or entity authorized by the copyright -owner that is granting the License. - -“Legal Entity” shall mean the union of the acting entity and all other entities -that control, are controlled by, or are under common control with that entity. -For the purposes of this definition, “control” means **(i)** the power, direct or -indirect, to cause the direction or management of such entity, whether by -contract or otherwise, or **(ii)** ownership of fifty percent (50%) or more of the -outstanding shares, or **(iii)** beneficial ownership of such entity. - -“You” (or “Your”) shall mean an individual or Legal Entity exercising -permissions granted by this License. - -“Source” form shall mean the preferred form for making modifications, including -but not limited to software source code, documentation source, and configuration -files. - -“Object” form shall mean any form resulting from mechanical transformation or -translation of a Source form, including but not limited to compiled object code, -generated documentation, and conversions to other media types. - -“Work” shall mean the work of authorship, whether in Source or Object form, made -available under the License, as indicated by a copyright notice that is included -in or attached to the work (an example is provided in the Appendix below). - -“Derivative Works” shall mean any work, whether in Source or Object form, that -is based on (or derived from) the Work and for which the editorial revisions, -annotations, elaborations, or other modifications represent, as a whole, an -original work of authorship. For the purposes of this License, Derivative Works -shall not include works that remain separable from, or merely link (or bind by -name) to the interfaces of, the Work and Derivative Works thereof. - -“Contribution” shall mean any work of authorship, including the original version -of the Work and any modifications or additions to that Work or Derivative Works -thereof, that is intentionally submitted to Licensor for inclusion in the Work -by the copyright owner or by an individual or Legal Entity authorized to submit -on behalf of the copyright owner. For the purposes of this definition, -“submitted” means any form of electronic, verbal, or written communication sent -to the Licensor or its representatives, including but not limited to -communication on electronic mailing lists, source code control systems, and -issue tracking systems that are managed by, or on behalf of, the Licensor for -the purpose of discussing and improving the Work, but excluding communication -that is conspicuously marked or otherwise designated in writing by the copyright -owner as “Not a Contribution.” - -“Contributor” shall mean Licensor and any individual or Legal Entity on behalf -of whom a Contribution has been received by Licensor and subsequently -incorporated within the Work. - -#### 2. Grant of Copyright License - -Subject to the terms and conditions of this License, each Contributor hereby -grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, -irrevocable copyright license to reproduce, prepare Derivative Works of, -publicly display, publicly perform, sublicense, and distribute the Work and such -Derivative Works in Source or Object form. - -#### 3. Grant of Patent License - -Subject to the terms and conditions of this License, each Contributor hereby -grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, -irrevocable (except as stated in this section) patent license to make, have -made, use, offer to sell, sell, import, and otherwise transfer the Work, where -such license applies only to those patent claims licensable by such Contributor -that are necessarily infringed by their Contribution(s) alone or by combination -of their Contribution(s) with the Work to which such Contribution(s) was -submitted. If You institute patent litigation against any entity (including a -cross-claim or counterclaim in a lawsuit) alleging that the Work or a -Contribution incorporated within the Work constitutes direct or contributory -patent infringement, then any patent licenses granted to You under this License -for that Work shall terminate as of the date such litigation is filed. - -#### 4. Redistribution - -You may reproduce and distribute copies of the Work or Derivative Works thereof -in any medium, with or without modifications, and in Source or Object form, -provided that You meet the following conditions: - -* **(a)** You must give any other recipients of the Work or Derivative Works a -copy of this License; and -* **(b)** You must cause any modified files to carry prominent notices stating -that You changed the files; and -* **(c)** You must retain, in the Source form of any Derivative Works that You -distribute, all copyright, patent, trademark, and attribution notices from the -Source form of the Work, excluding those notices that do not pertain to any part -of the Derivative Works; and -* **(d)** If the Work includes a “NOTICE” text file as part of its distribution, -then any Derivative Works that You distribute must include a readable copy of the -attribution notices contained within such NOTICE file, excluding those notices -that do not pertain to any part of the Derivative Works, in at least one of the -following places: within a NOTICE text file distributed as part of the -Derivative Works; within the Source form or documentation, if provided along -with the Derivative Works; or, within a display generated by the Derivative -Works, if and wherever such third-party notices normally appear. The contents of -the NOTICE file are for informational purposes only and do not modify the -License. You may add Your own attribution notices within Derivative Works that -You distribute, alongside or as an addendum to the NOTICE text from the Work, -provided that such additional attribution notices cannot be construed as -modifying the License. - -You may add Your own copyright statement to Your modifications and may provide -additional or different license terms and conditions for use, reproduction, or -distribution of Your modifications, or for any such Derivative Works as a whole, -provided Your use, reproduction, and distribution of the Work otherwise complies -with the conditions stated in this License. - -#### 5. Submission of Contributions - -Unless You explicitly state otherwise, any Contribution intentionally submitted -for inclusion in the Work by You to the Licensor shall be under the terms and -conditions of this License, without any additional terms or conditions. -Notwithstanding the above, nothing herein shall supersede or modify the terms of -any separate license agreement you may have executed with Licensor regarding -such Contributions. - -#### 6. Trademarks - -This License does not grant permission to use the trade names, trademarks, -service marks, or product names of the Licensor, except as required for -reasonable and customary use in describing the origin of the Work and -reproducing the content of the NOTICE file. - -#### 7. Disclaimer of Warranty - -Unless required by applicable law or agreed to in writing, Licensor provides the -Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, -including, without limitation, any warranties or conditions of TITLE, -NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are -solely responsible for determining the appropriateness of using or -redistributing the Work and assume any risks associated with Your exercise of -permissions under this License. - -#### 8. Limitation of Liability - -In no event and under no legal theory, whether in tort (including negligence), -contract, or otherwise, unless required by applicable law (such as deliberate -and grossly negligent acts) or agreed to in writing, shall any Contributor be -liable to You for damages, including any direct, indirect, special, incidental, -or consequential damages of any character arising as a result of this License or -out of the use or inability to use the Work (including but not limited to -damages for loss of goodwill, work stoppage, computer failure or malfunction, or -any and all other commercial damages or losses), even if such Contributor has -been advised of the possibility of such damages. - -#### 9. Accepting Warranty or Additional Liability - -While redistributing the Work or Derivative Works thereof, You may choose to -offer, and charge a fee for, acceptance of support, warranty, indemnity, or -other liability obligations and/or rights consistent with this License. However, -in accepting such obligations, You may act only on Your own behalf and on Your -sole responsibility, not on behalf of any other Contributor, and only if You -agree to indemnify, defend, and hold each Contributor harmless for any liability -incurred by, or claims asserted against, such Contributor by reason of your -accepting any such warranty or additional liability. - -## [Creative Commons Attribution 4.0 International Public License](https://creativecommons.org/licenses/by/4.0/) for [PrivateBin favicons, icons & logos](https://github.com/PrivateBin/assets) by [rugk](https://github.com/rugk) - -By exercising the Licensed Rights (defined below), You accept and agree to be -bound by the terms and conditions of this Creative Commons Attribution 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. - -### Section 1 – Definitions. - -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. __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. - -d. __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. - -e. __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. - -f. __Licensed Material__ means the artistic or literary work, database, or other -material to which the Licensor applied this Public License. - -g. __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. - -h. __Licensor__ means the individual(s) or entity(ies) granting rights under -this Public License. - -i. __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. - -j. __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. - -k. __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; and - - B. produce, reproduce, and Share Adapted Material. - - 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. __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. - -### 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. - - 4. If You Share Adapted Material You produce, the Adapter's License You - apply must not prevent recipients of the Adapted Material from complying - with this Public License. - -### 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; - -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; 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. diff --git a/README.md b/README.md deleted file mode 100644 index 139c6121..00000000 --- a/README.md +++ /dev/null @@ -1,118 +0,0 @@ -# [PrivateBin](https://privatebin.info/) -[![Build Status](https://travis-ci.org/PrivateBin/PrivateBin.svg?branch=master)](https://travis-ci.org/PrivateBin/PrivateBin) [![Build Status](https://scrutinizer-ci.com/g/PrivateBin/PrivateBin/badges/build.png?b=master)](https://scrutinizer-ci.com/g/PrivateBin/PrivateBin/build-status/master) -[![Codacy Badge](https://api.codacy.com/project/badge/Grade/094500f62abf4c9aa0c8a8a4520e4789)](https://www.codacy.com/app/PrivateBin/PrivateBin) -[![Code Climate](https://codeclimate.com/github/PrivateBin/PrivateBin/badges/gpa.svg)](https://codeclimate.com/github/PrivateBin/PrivateBin) -[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/PrivateBin/PrivateBin/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/PrivateBin/PrivateBin/?branch=master) -[![SensioLabsInsight](https://insight.sensiolabs.com/projects/57c9e74e-c6f9-4de6-a876-df66ec2ea1ff/mini.png)](https://insight.sensiolabs.com/projects/57c9e74e-c6f9-4de6-a876-df66ec2ea1ff) -[![Codacy Badge](https://api.codacy.com/project/badge/Coverage/094500f62abf4c9aa0c8a8a4520e4789)](https://www.codacy.com/app/PrivateBin/PrivateBin) -[![Test Coverage](https://codeclimate.com/github/PrivateBin/PrivateBin/badges/coverage.svg)](https://codeclimate.com/github/PrivateBin/PrivateBin/coverage) [![Code Coverage](https://scrutinizer-ci.com/g/PrivateBin/PrivateBin/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/PrivateBin/PrivateBin/?branch=master) - -*Current version: 1.2.1* - -**PrivateBin** is a minimalist, open source online [pastebin](https://en.wikipedia.org/wiki/Pastebin) -where the server has zero knowledge of pasted data. - -Data is encrypted and decrypted in the browser using 256bit AES in [Galois Counter mode](https://en.wikipedia.org/wiki/Galois/Counter_Mode). - -This is a fork of ZeroBin, originally developed by -[Sébastien Sauvage](https://github.com/sebsauvage/ZeroBin). ZeroBin was refactored -to allow easier and cleaner extensions. PrivateBin has many more features than the -original ZeroBin. It is, however, still fully compatible to the original ZeroBin 0.19 -data storage scheme. Therefore, such installations can be upgraded to PrivateBin -without losing any data. - -## What PrivateBin provides - -+ As a server administrator you don't have to worry if your users post content - that is considered illegal in your country. You have no knowledge of any - of the pastes content. If requested or enforced, you can delete any paste from - your system. - -+ Pastebin-like system to store text documents, code samples, etc. - -+ Encryption of data sent to server. - -+ Possibility to set a password which is required to read the paste. It further - protects a paste and prevents people stumbling upon your paste's link - from being able to read it without the password. - -## What it doesn't provide - -- As a user you have to trust the server administrator not to inject any malicious - javascript code. - For basic security, the PrivateBin installation *has to provide HTTPS*! - Otherwise you would also have to trust your internet provider, and any country - the traffic passes through. - Additionally the instance should be secured by - [HSTS](https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security) and - ideally by [HPKP](https://en.wikipedia.org/wiki/HTTP_Public_Key_Pinning) using a - certificate. It can use traditional certificate authorities and/or use - [DNSSEC](https://en.wikipedia.org/wiki/Domain_Name_System_Security_Extensions) - protected - [DANE](https://en.wikipedia.org/wiki/DNS-based_Authentication_of_Named_Entities) - record. - -- The "key" used to encrypt the paste is part of the URL. If you publicly post - the URL of a paste that is not password-protected, anyone can read it. - Use a password if you want your paste to be private. In this case, make sure to - use a strong password and only share it privately and end-to-end-encrypted. - -- A server admin might be forced to hand over access logs to the authorities. - PrivateBin encrypts your text and the discussion contents, but who accessed a - paste (first) might still be disclosed via access logs. - -- In case of a server breach your data is secure as it is only stored encrypted - on the server. However, the server could be misused or the server admin could - be legally forced into sending malicious JavaScript to all web users, which - grabs the decryption key and sends it to the server when a user accesses a - PrivateBin. - Therefore, do not access any PrivateBin instance if you think it has been - compromised. As long as no user accesses this instance with a previously - generated URL, the content can't be decrypted. - -## Options - -Some features are optional and can be enabled or disabled in the [configuration -file](https://github.com/PrivateBin/PrivateBin/wiki/Configuration): - -* Password protection - -* Discussions, anonymous or with nicknames and IP based identicons or vizhashes - -* Expiration times, including a "forever" and "burn after reading" option - -* Markdown format support for HTML formatted pastes, including preview function - -* Syntax highlighting for source code using prettify.js, including 4 prettify - themes - -* File upload support, images get displayed (disabled by default, possibility - to adjust size limit) - -* Templates: By default there are bootstrap CSS, darkstrap and "classic ZeroBin" - to choose from and it is easy to adapt these to your own websites layout or - create your own. - -* Translation system and automatic browser language detection (if enabled in - browser) - -* Language selection (disabled by default, as it uses a session cookie) - -* QR code generation of URL, to easily transfer pastes over to a mobile device - -## Further resources - -* [Installation guide](https://github.com/PrivateBin/PrivateBin/blob/master/INSTALL.md#installation) - -* [Upgrading from ZeroBin 0.19 Alpha](https://github.com/PrivateBin/PrivateBin/wiki/Upgrading-from-ZeroBin-0.19-Alpha) - -* [Configuration guide](https://github.com/PrivateBin/PrivateBin/wiki/Configuration) - -* [Templates](https://github.com/PrivateBin/PrivateBin/wiki/Templates) - -* [Translation guide](https://github.com/PrivateBin/PrivateBin/wiki/Translation) - -* [Developer guide](https://github.com/PrivateBin/PrivateBin/wiki/Development) - -Run into any issues? Have ideas for further developments? Please -[report](https://github.com/PrivateBin/PrivateBin/issues) them! diff --git a/browserconfig.xml b/browserconfig.xml deleted file mode 100644 index 7a25581d..00000000 --- a/browserconfig.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - #ffc40d - - - diff --git a/cfg/.htaccess b/cfg/.htaccess deleted file mode 100644 index b584d98c..00000000 --- a/cfg/.htaccess +++ /dev/null @@ -1,2 +0,0 @@ -Allow from none -Deny from all diff --git a/cfg/conf.php b/cfg/conf.php deleted file mode 100644 index 0bf70766..00000000 --- a/cfg/conf.php +++ /dev/null @@ -1,154 +0,0 @@ -;.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}@font-face{font-family:'Glyphicons Halflings';src:url('fonts/glyphicons-halflings-regular.eot');src:url('fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('fonts/glyphicons-halflings-regular.woff2') format('woff2'),url('fonts/glyphicons-halflings-regular.woff') format('woff'),url('fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before,.glyphicon-eur:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:hover,a:focus{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role="button"]{cursor:pointer}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#777}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}mark,.mark{background-color:#fcf8e3;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:hover,a.text-primary:focus{color:#286090}.text-success{color:#3c763d}a.text-success:hover,a.text-success:focus{color:#2b542c}.text-info{color:#31708f}a.text-info:hover,a.text-info:focus{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover,a.text-warning:focus{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover,a.text-danger:focus{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:hover,a.bg-primary:focus{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:hover,a.bg-success:focus{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover,a.bg-info:focus{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover,a.bg-warning:focus{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover,a.bg-danger:focus{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:bold}dd{margin-left:0}@media (min-width:992px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}kbd kbd{padding:0;font-size:100%;font-weight:bold;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*="col-"]{position:static;float:none;display:table-column}table td[class*="col-"],table th[class*="col-"]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}.table-responsive{overflow-x:auto;min-height:0.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type="date"].form-control,input[type="time"].form-control,input[type="datetime-local"].form-control,input[type="month"].form-control{line-height:34px}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm,.input-group-sm input[type="date"],.input-group-sm input[type="time"],.input-group-sm input[type="datetime-local"],.input-group-sm input[type="month"]{line-height:30px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg,.input-group-lg input[type="date"],.input-group-lg input[type="time"],.input-group-lg input[type="datetime-local"],.input-group-lg input[type="month"]{line-height:46px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0;min-height:34px}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm textarea.form-control,.form-group-sm select[multiple].form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg,select[multiple].input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg textarea.form-control,.form-group-lg select[multiple].form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback,.input-group-lg+.form-control-feedback,.form-group-lg .form-control+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback,.input-group-sm+.form-control-feedback,.form-group-sm .form-control+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:7px}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.333333px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#333;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:focus,.btn-default.focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active:hover,.btn-default.active:hover,.open>.dropdown-toggle.btn-default:hover,.btn-default:active:focus,.btn-default.active:focus,.open>.dropdown-toggle.btn-default:focus,.btn-default:active.focus,.btn-default.active.focus,.open>.dropdown-toggle.btn-default.focus{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary:focus,.btn-primary.focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary:active:hover,.btn-primary.active:hover,.open>.dropdown-toggle.btn-primary:hover,.btn-primary:active:focus,.btn-primary.active:focus,.open>.dropdown-toggle.btn-primary:focus,.btn-primary:active.focus,.btn-primary.active.focus,.open>.dropdown-toggle.btn-primary.focus{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:focus,.btn-success.focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active:hover,.btn-success.active:hover,.open>.dropdown-toggle.btn-success:hover,.btn-success:active:focus,.btn-success.active:focus,.open>.dropdown-toggle.btn-success:focus,.btn-success:active.focus,.btn-success.active.focus,.open>.dropdown-toggle.btn-success.focus{color:#fff;background-color:#398439;border-color:#255625}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:focus,.btn-info.focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active:hover,.btn-info.active:hover,.open>.dropdown-toggle.btn-info:hover,.btn-info:active:focus,.btn-info.active:focus,.open>.dropdown-toggle.btn-info:focus,.btn-info:active.focus,.btn-info.active.focus,.open>.dropdown-toggle.btn-info.focus{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:focus,.btn-warning.focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active:hover,.btn-warning.active:hover,.open>.dropdown-toggle.btn-warning:hover,.btn-warning:active:focus,.btn-warning.active:focus,.open>.dropdown-toggle.btn-warning:focus,.btn-warning:active.focus,.btn-warning.active.focus,.open>.dropdown-toggle.btn-warning.focus{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:focus,.btn-danger.focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active:hover,.btn-danger.active:hover,.open>.dropdown-toggle.btn-danger:hover,.btn-danger:active:focus,.btn-danger.active:focus,.open>.dropdown-toggle.btn-danger:focus,.btn-danger:active.focus,.btn-danger.active.focus,.open>.dropdown-toggle.btn-danger.focus{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#337ab7;font-weight:normal;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#777;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height, visibility;-o-transition-property:height, visibility;transition-property:height, visibility;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid \9;border-right:4px solid transparent;border-left:4px solid transparent}.dropup,.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;text-align:left;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);-webkit-background-clip:padding-box;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#262626;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#337ab7}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#777}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px dashed;border-bottom:4px solid \9;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:992px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:4px;border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle="buttons"]>.btn input[type="radio"],[data-toggle="buttons"]>.btn-group>.btn input[type="radio"],[data-toggle="buttons"]>.btn input[type="checkbox"],[data-toggle="buttons"]>.btn-group>.btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:normal;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#777;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:992px){.navbar{border-radius:4px}}@media (min-width:992px){.navbar-header{float:left}}.navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:992px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:992px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:992px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:992px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px 15px;font-size:18px;line-height:20px;height:50px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:992px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:992px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:991px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:992px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:8px;margin-bottom:8px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:991px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:992px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:992px){.navbar-text{float:left;margin-left:15px;margin-right:15px}}@media (min-width:992px){.navbar-left{float:left !important}.navbar-right{float:right !important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#e7e7e7;color:#555}@media (max-width:991px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#333}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#080808;color:#fff}@media (max-width:991px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#fff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#ccc}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;line-height:1.42857143;text-decoration:none;color:#337ab7;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{z-index:3;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#777;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:20px 0;list-style:none;text-align:center}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#777;background-color:#fff;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:hover,.label-default[href]:focus{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:bold;color:#fff;line-height:1;vertical-align:middle;white-space:nowrap;text-align:center;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge,.btn-group-xs>.btn .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:20px;margin-bottom:20px;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0%;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{zoom:1;overflow:hidden}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-left,.media-right,.media-body{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,button.list-group-item:hover,a.list-group-item:focus,button.list-group-item:focus{text-decoration:none;color:#555;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{background-color:#eee;color:#777;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,button.list-group-item-success:hover,a.list-group-item-success:focus,button.list-group-item-success:focus{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,button.list-group-item-success.active,a.list-group-item-success.active:hover,button.list-group-item-success.active:hover,a.list-group-item-success.active:focus,button.list-group-item-success.active:focus{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,button.list-group-item-info:hover,a.list-group-item-info:focus,button.list-group-item-info:focus{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,button.list-group-item-info.active,a.list-group-item-info.active:hover,button.list-group-item-info.active:hover,a.list-group-item-info.active:focus,button.list-group-item-info.active:focus{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,button.list-group-item-warning:hover,a.list-group-item-warning:focus,button.list-group-item-warning:focus{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,button.list-group-item-warning.active,a.list-group-item-warning.active:hover,button.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus,button.list-group-item-warning.active:focus{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,button.list-group-item-danger:hover,a.list-group-item-danger:focus,button.list-group-item-danger:focus{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,button.list-group-item-danger.active,a.list-group-item-danger.active:hover,button.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus,button.list-group-item-danger.active:focus{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a,.panel-title>small,.panel-title>.small,.panel-title>small>a,.panel-title>.small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table caption,.panel>.table-responsive>.table caption,.panel>.panel-collapse>.table caption{padding-left:15px;padding-right:15px}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:3px;border-bottom-right-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body,.panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:bold;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0, -25%);-ms-transform:translate(0, -25%);-o-transform:translate(0, -25%);transform:translate(0, -25%);-webkit-transition:-webkit-transform 0.3s ease-out;-o-transition:-o-transform 0.3s ease-out;transition:transform 0.3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);-webkit-background-clip:padding-box;background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.42857143px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:12px;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{bottom:0;right:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:14px;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,0.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#fff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,0.25)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#fff;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform 0.6s ease-in-out;-o-transition:-o-transform 0.6s ease-in-out;transition:transform 0.6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.next,.carousel-inner>.item.active.right{-webkit-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0);left:0}.carousel-inner>.item.prev,.carousel-inner>.item.active.left{-webkit-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0);left:0}.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right,.carousel-inner>.item.active{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:.5;filter:alpha(opacity=50);font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-webkit-gradient(linear, left top, right top, color-stop(0, rgba(0,0,0,0.5)), to(rgba(0,0,0,0.0001)));background-image:linear-gradient(to right, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-webkit-gradient(linear, left top, right top, color-stop(0, rgba(0,0,0,0.0001)), to(rgba(0,0,0,0.5)));background-image:linear-gradient(to right, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;margin-top:-10px;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;line-height:1;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #fff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#fff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table !important}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:767px){.visible-xs-block{display:block !important}}@media (max-width:767px){.visible-xs-inline{display:inline !important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block !important}table.visible-sm{display:table !important}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table !important}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table !important}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:1200px){.visible-lg-block{display:block !important}}@media (min-width:1200px){.visible-lg-inline{display:inline !important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){.hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none !important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none !important}}@media (min-width:1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table !important}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}} \ No newline at end of file diff --git a/css/bootstrap/bootstrap-theme-3.3.5.css b/css/bootstrap/bootstrap-theme-3.3.5.css deleted file mode 100644 index a03a2952..00000000 --- a/css/bootstrap/bootstrap-theme-3.3.5.css +++ /dev/null @@ -1,5 +0,0 @@ -/*! - * Bootstrap v3.3.5 (https://getbootstrap.com) - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */.btn-danger,.btn-default,.btn-info,.btn-primary,.btn-success,.btn-warning{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-danger.disabled,.btn-danger[disabled],.btn-default.disabled,.btn-default[disabled],.btn-info.disabled,.btn-info[disabled],.btn-primary.disabled,.btn-primary[disabled],.btn-success.disabled,.btn-success[disabled],.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-danger,fieldset[disabled] .btn-default,fieldset[disabled] .btn-info,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-success,fieldset[disabled] .btn-warning{-webkit-box-shadow:none;box-shadow:none}.btn-danger .badge,.btn-default .badge,.btn-info .badge,.btn-primary .badge,.btn-success .badge,.btn-warning .badge{text-shadow:none}.btn.active,.btn:active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc}.btn-default:focus,.btn-default:hover{background-color:#e0e0e0;background-position:0 -15px}.btn-default.active,.btn-default:active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#245580}.btn-primary:focus,.btn-primary:hover{background-color:#265a88;background-position:0 -15px}.btn-primary.active,.btn-primary:active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:focus,.btn-success:hover{background-color:#419641;background-position:0 -15px}.btn-success.active,.btn-success:active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:focus,.btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.btn-info.active,.btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:focus,.btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.btn-warning.active,.btn-warning:active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:focus,.btn-danger:hover{background-color:#c12e2a;background-position:0 -15px}.btn-danger.active,.btn-danger:active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#c12e2a;background-image:none}.img-thumbnail,.thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-color:#2e6da4;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337ab7 0,#286090 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);background-repeat:repeat-x;border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:focus .badge,.list-group-item.active:hover .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)} \ No newline at end of file diff --git a/css/bootstrap/darkstrap-0.9.3.css b/css/bootstrap/darkstrap-0.9.3.css deleted file mode 100644 index 72427f5f..00000000 --- a/css/bootstrap/darkstrap-0.9.3.css +++ /dev/null @@ -1,8061 +0,0 @@ -@charset "UTF-8"; -/* - * Darkstrap v0.9.3 - * By danneu (https://github.com/danneu/darkstrap) - * Based off Twitter Bootstrap v3.3.5 - */ -/*! - * Bootstrap v3.3.5 (https://getbootstrap.com) - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ -/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ -html { - font-family: sans-serif; - -ms-text-size-adjust: 100%; - -webkit-text-size-adjust: 100%; -} - -body { - margin: 0; -} - -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -main, -menu, -nav, -section, -summary { - display: block; -} - -audio, -canvas, -progress, -video { - display: inline-block; - vertical-align: baseline; -} - -audio:not([controls]) { - display: none; - height: 0; -} - -[hidden], -template { - display: none; -} - -a { - background-color: transparent; -} - -a:active, -a:hover { - outline: 0; -} - -abbr[title] { - border-bottom: 1px dotted; -} - -b, -strong { - font-weight: bold; -} - -dfn { - font-style: italic; -} - -h1 { - font-size: 2em; - margin: 0.67em 0; -} - -mark { - background: #ff0; - color: #000; -} - -small { - font-size: 80%; -} - -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} - -sup { - top: -0.5em; -} - -sub { - bottom: -0.25em; -} - -img { - border: 0; -} - -svg:not(:root) { - overflow: hidden; -} - -figure { - margin: 1em 40px; -} - -hr { - box-sizing: content-box; - height: 0; -} - -pre { - overflow: auto; -} - -code, -kbd, -pre, -samp { - font-family: monospace, monospace; - font-size: 1em; -} - -button, -input, -optgroup, -select, -textarea { - color: inherit; - font: inherit; - margin: 0; -} - -button { - overflow: visible; -} - -button, -select { - text-transform: none; -} - -button, -html input[type="button"], -input[type="reset"], -input[type="submit"] { - -webkit-appearance: button; - cursor: pointer; -} - -button[disabled], -html input[disabled] { - cursor: default; -} - -button::-moz-focus-inner, -input::-moz-focus-inner { - border: 0; - padding: 0; -} - -input { - line-height: normal; -} - -input[type="checkbox"], -input[type="radio"] { - box-sizing: border-box; - padding: 0; -} - -input[type="number"]::-webkit-inner-spin-button, -input[type="number"]::-webkit-outer-spin-button { - height: auto; -} - -input[type="search"] { - -webkit-appearance: textfield; - box-sizing: content-box; -} - -input[type="search"]::-webkit-search-cancel-button, -input[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} - -fieldset { - border: 1px solid #c0c0c0; - margin: 0 2px; - padding: 0.35em 0.625em 0.75em; -} - -legend { - border: 0; - padding: 0; -} - -textarea { - overflow: auto; -} - -optgroup { - font-weight: bold; -} - -table { - border-collapse: collapse; - border-spacing: 0; -} - -td, -th { - padding: 0; -} - -/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ -@media print { - *, - *:before, - *:after { - background: transparent !important; - color: #000 !important; - box-shadow: none !important; - text-shadow: none !important; - } - - a, - a:visited { - text-decoration: underline; - } - - a[href]:after { - content: " (" attr(href) ")"; - } - - abbr[title]:after { - content: " (" attr(title) ")"; - } - - a[href^="#"]:after, - a[href^="javascript:"]:after { - content: ""; - } - - pre, - blockquote { - border: 1px solid #999; - page-break-inside: avoid; - } - - thead { - display: table-header-group; - } - - tr, - img { - page-break-inside: avoid; - } - - img { - max-width: 100% !important; - } - - p, - h2, - h3 { - orphans: 3; - widows: 3; - } - - h2, - h3 { - page-break-after: avoid; - } - - .navbar { - display: none; - } - - .btn > .caret, - .dropup > .btn > .caret { - border-top-color: #000 !important; - } - - .label { - border: 1px solid #000; - } - - .table { - border-collapse: collapse !important; - } - .table td, - .table th { - background-color: #fff !important; - } - - .table-bordered th, - .table-bordered td { - border: 1px solid #ddd !important; - } -} -@font-face { - font-family: 'Glyphicons Halflings'; - src: url(fonts/../fonts/glyphicons-halflings-regular.eot?1445975532); - src: url(fonts/../fonts/glyphicons-halflings-regular.eot?&1445975532#iefix) format("embedded-opentype"), url(fonts/../fonts/glyphicons-halflings-regular.woff2?1445975532) format("woff2"), url(fonts/../fonts/glyphicons-halflings-regular.woff?1445975532) format("woff"), url(fonts/../fonts/glyphicons-halflings-regular.ttf?1445975532) format("truetype"), url(fonts/../fonts/glyphicons-halflings-regular.svg?1445975532#glyphicons_halflingsregular) format("svg"); -} -.glyphicon { - position: relative; - top: 1px; - display: inline-block; - font-family: 'Glyphicons Halflings'; - font-style: normal; - font-weight: normal; - line-height: 1; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -.glyphicon-asterisk:before { - content: "\2a"; -} - -.glyphicon-plus:before { - content: "\2b"; -} - -.glyphicon-euro:before, -.glyphicon-eur:before { - content: "\20ac"; -} - -.glyphicon-minus:before { - content: "\2212"; -} - -.glyphicon-cloud:before { - content: "\2601"; -} - -.glyphicon-envelope:before { - content: "\2709"; -} - -.glyphicon-pencil:before { - content: "\270f"; -} - -.glyphicon-glass:before { - content: "\e001"; -} - -.glyphicon-music:before { - content: "\e002"; -} - -.glyphicon-search:before { - content: "\e003"; -} - -.glyphicon-heart:before { - content: "\e005"; -} - -.glyphicon-star:before { - content: "\e006"; -} - -.glyphicon-star-empty:before { - content: "\e007"; -} - -.glyphicon-user:before { - content: "\e008"; -} - -.glyphicon-film:before { - content: "\e009"; -} - -.glyphicon-th-large:before { - content: "\e010"; -} - -.glyphicon-th:before { - content: "\e011"; -} - -.glyphicon-th-list:before { - content: "\e012"; -} - -.glyphicon-ok:before { - content: "\e013"; -} - -.glyphicon-remove:before { - content: "\e014"; -} - -.glyphicon-zoom-in:before { - content: "\e015"; -} - -.glyphicon-zoom-out:before { - content: "\e016"; -} - -.glyphicon-off:before { - content: "\e017"; -} - -.glyphicon-signal:before { - content: "\e018"; -} - -.glyphicon-cog:before { - content: "\e019"; -} - -.glyphicon-trash:before { - content: "\e020"; -} - -.glyphicon-home:before { - content: "\e021"; -} - -.glyphicon-file:before { - content: "\e022"; -} - -.glyphicon-time:before { - content: "\e023"; -} - -.glyphicon-road:before { - content: "\e024"; -} - -.glyphicon-download-alt:before { - content: "\e025"; -} - -.glyphicon-download:before { - content: "\e026"; -} - -.glyphicon-upload:before { - content: "\e027"; -} - -.glyphicon-inbox:before { - content: "\e028"; -} - -.glyphicon-play-circle:before { - content: "\e029"; -} - -.glyphicon-repeat:before { - content: "\e030"; -} - -.glyphicon-refresh:before { - content: "\e031"; -} - -.glyphicon-list-alt:before { - content: "\e032"; -} - -.glyphicon-lock:before { - content: "\e033"; -} - -.glyphicon-flag:before { - content: "\e034"; -} - -.glyphicon-headphones:before { - content: "\e035"; -} - -.glyphicon-volume-off:before { - content: "\e036"; -} - -.glyphicon-volume-down:before { - content: "\e037"; -} - -.glyphicon-volume-up:before { - content: "\e038"; -} - -.glyphicon-qrcode:before { - content: "\e039"; -} - -.glyphicon-barcode:before { - content: "\e040"; -} - -.glyphicon-tag:before { - content: "\e041"; -} - -.glyphicon-tags:before { - content: "\e042"; -} - -.glyphicon-book:before { - content: "\e043"; -} - -.glyphicon-bookmark:before { - content: "\e044"; -} - -.glyphicon-print:before { - content: "\e045"; -} - -.glyphicon-camera:before { - content: "\e046"; -} - -.glyphicon-font:before { - content: "\e047"; -} - -.glyphicon-bold:before { - content: "\e048"; -} - -.glyphicon-italic:before { - content: "\e049"; -} - -.glyphicon-text-height:before { - content: "\e050"; -} - -.glyphicon-text-width:before { - content: "\e051"; -} - -.glyphicon-align-left:before { - content: "\e052"; -} - -.glyphicon-align-center:before { - content: "\e053"; -} - -.glyphicon-align-right:before { - content: "\e054"; -} - -.glyphicon-align-justify:before { - content: "\e055"; -} - -.glyphicon-list:before { - content: "\e056"; -} - -.glyphicon-indent-left:before { - content: "\e057"; -} - -.glyphicon-indent-right:before { - content: "\e058"; -} - -.glyphicon-facetime-video:before { - content: "\e059"; -} - -.glyphicon-picture:before { - content: "\e060"; -} - -.glyphicon-map-marker:before { - content: "\e062"; -} - -.glyphicon-adjust:before { - content: "\e063"; -} - -.glyphicon-tint:before { - content: "\e064"; -} - -.glyphicon-edit:before { - content: "\e065"; -} - -.glyphicon-share:before { - content: "\e066"; -} - -.glyphicon-check:before { - content: "\e067"; -} - -.glyphicon-move:before { - content: "\e068"; -} - -.glyphicon-step-backward:before { - content: "\e069"; -} - -.glyphicon-fast-backward:before { - content: "\e070"; -} - -.glyphicon-backward:before { - content: "\e071"; -} - -.glyphicon-play:before { - content: "\e072"; -} - -.glyphicon-pause:before { - content: "\e073"; -} - -.glyphicon-stop:before { - content: "\e074"; -} - -.glyphicon-forward:before { - content: "\e075"; -} - -.glyphicon-fast-forward:before { - content: "\e076"; -} - -.glyphicon-step-forward:before { - content: "\e077"; -} - -.glyphicon-eject:before { - content: "\e078"; -} - -.glyphicon-chevron-left:before { - content: "\e079"; -} - -.glyphicon-chevron-right:before { - content: "\e080"; -} - -.glyphicon-plus-sign:before { - content: "\e081"; -} - -.glyphicon-minus-sign:before { - content: "\e082"; -} - -.glyphicon-remove-sign:before { - content: "\e083"; -} - -.glyphicon-ok-sign:before { - content: "\e084"; -} - -.glyphicon-question-sign:before { - content: "\e085"; -} - -.glyphicon-info-sign:before { - content: "\e086"; -} - -.glyphicon-screenshot:before { - content: "\e087"; -} - -.glyphicon-remove-circle:before { - content: "\e088"; -} - -.glyphicon-ok-circle:before { - content: "\e089"; -} - -.glyphicon-ban-circle:before { - content: "\e090"; -} - -.glyphicon-arrow-left:before { - content: "\e091"; -} - -.glyphicon-arrow-right:before { - content: "\e092"; -} - -.glyphicon-arrow-up:before { - content: "\e093"; -} - -.glyphicon-arrow-down:before { - content: "\e094"; -} - -.glyphicon-share-alt:before { - content: "\e095"; -} - -.glyphicon-resize-full:before { - content: "\e096"; -} - -.glyphicon-resize-small:before { - content: "\e097"; -} - -.glyphicon-exclamation-sign:before { - content: "\e101"; -} - -.glyphicon-gift:before { - content: "\e102"; -} - -.glyphicon-leaf:before { - content: "\e103"; -} - -.glyphicon-fire:before { - content: "\e104"; -} - -.glyphicon-eye-open:before { - content: "\e105"; -} - -.glyphicon-eye-close:before { - content: "\e106"; -} - -.glyphicon-warning-sign:before { - content: "\e107"; -} - -.glyphicon-plane:before { - content: "\e108"; -} - -.glyphicon-calendar:before { - content: "\e109"; -} - -.glyphicon-random:before { - content: "\e110"; -} - -.glyphicon-comment:before { - content: "\e111"; -} - -.glyphicon-magnet:before { - content: "\e112"; -} - -.glyphicon-chevron-up:before { - content: "\e113"; -} - -.glyphicon-chevron-down:before { - content: "\e114"; -} - -.glyphicon-retweet:before { - content: "\e115"; -} - -.glyphicon-shopping-cart:before { - content: "\e116"; -} - -.glyphicon-folder-close:before { - content: "\e117"; -} - -.glyphicon-folder-open:before { - content: "\e118"; -} - -.glyphicon-resize-vertical:before { - content: "\e119"; -} - -.glyphicon-resize-horizontal:before { - content: "\e120"; -} - -.glyphicon-hdd:before { - content: "\e121"; -} - -.glyphicon-bullhorn:before { - content: "\e122"; -} - -.glyphicon-bell:before { - content: "\e123"; -} - -.glyphicon-certificate:before { - content: "\e124"; -} - -.glyphicon-thumbs-up:before { - content: "\e125"; -} - -.glyphicon-thumbs-down:before { - content: "\e126"; -} - -.glyphicon-hand-right:before { - content: "\e127"; -} - -.glyphicon-hand-left:before { - content: "\e128"; -} - -.glyphicon-hand-up:before { - content: "\e129"; -} - -.glyphicon-hand-down:before { - content: "\e130"; -} - -.glyphicon-circle-arrow-right:before { - content: "\e131"; -} - -.glyphicon-circle-arrow-left:before { - content: "\e132"; -} - -.glyphicon-circle-arrow-up:before { - content: "\e133"; -} - -.glyphicon-circle-arrow-down:before { - content: "\e134"; -} - -.glyphicon-globe:before { - content: "\e135"; -} - -.glyphicon-wrench:before { - content: "\e136"; -} - -.glyphicon-tasks:before { - content: "\e137"; -} - -.glyphicon-filter:before { - content: "\e138"; -} - -.glyphicon-briefcase:before { - content: "\e139"; -} - -.glyphicon-fullscreen:before { - content: "\e140"; -} - -.glyphicon-dashboard:before { - content: "\e141"; -} - -.glyphicon-paperclip:before { - content: "\e142"; -} - -.glyphicon-heart-empty:before { - content: "\e143"; -} - -.glyphicon-link:before { - content: "\e144"; -} - -.glyphicon-phone:before { - content: "\e145"; -} - -.glyphicon-pushpin:before { - content: "\e146"; -} - -.glyphicon-usd:before { - content: "\e148"; -} - -.glyphicon-gbp:before { - content: "\e149"; -} - -.glyphicon-sort:before { - content: "\e150"; -} - -.glyphicon-sort-by-alphabet:before { - content: "\e151"; -} - -.glyphicon-sort-by-alphabet-alt:before { - content: "\e152"; -} - -.glyphicon-sort-by-order:before { - content: "\e153"; -} - -.glyphicon-sort-by-order-alt:before { - content: "\e154"; -} - -.glyphicon-sort-by-attributes:before { - content: "\e155"; -} - -.glyphicon-sort-by-attributes-alt:before { - content: "\e156"; -} - -.glyphicon-unchecked:before { - content: "\e157"; -} - -.glyphicon-expand:before { - content: "\e158"; -} - -.glyphicon-collapse-down:before { - content: "\e159"; -} - -.glyphicon-collapse-up:before { - content: "\e160"; -} - -.glyphicon-log-in:before { - content: "\e161"; -} - -.glyphicon-flash:before { - content: "\e162"; -} - -.glyphicon-log-out:before { - content: "\e163"; -} - -.glyphicon-new-window:before { - content: "\e164"; -} - -.glyphicon-record:before { - content: "\e165"; -} - -.glyphicon-save:before { - content: "\e166"; -} - -.glyphicon-open:before { - content: "\e167"; -} - -.glyphicon-saved:before { - content: "\e168"; -} - -.glyphicon-import:before { - content: "\e169"; -} - -.glyphicon-export:before { - content: "\e170"; -} - -.glyphicon-send:before { - content: "\e171"; -} - -.glyphicon-floppy-disk:before { - content: "\e172"; -} - -.glyphicon-floppy-saved:before { - content: "\e173"; -} - -.glyphicon-floppy-remove:before { - content: "\e174"; -} - -.glyphicon-floppy-save:before { - content: "\e175"; -} - -.glyphicon-floppy-open:before { - content: "\e176"; -} - -.glyphicon-credit-card:before { - content: "\e177"; -} - -.glyphicon-transfer:before { - content: "\e178"; -} - -.glyphicon-cutlery:before { - content: "\e179"; -} - -.glyphicon-header:before { - content: "\e180"; -} - -.glyphicon-compressed:before { - content: "\e181"; -} - -.glyphicon-earphone:before { - content: "\e182"; -} - -.glyphicon-phone-alt:before { - content: "\e183"; -} - -.glyphicon-tower:before { - content: "\e184"; -} - -.glyphicon-stats:before { - content: "\e185"; -} - -.glyphicon-sd-video:before { - content: "\e186"; -} - -.glyphicon-hd-video:before { - content: "\e187"; -} - -.glyphicon-subtitles:before { - content: "\e188"; -} - -.glyphicon-sound-stereo:before { - content: "\e189"; -} - -.glyphicon-sound-dolby:before { - content: "\e190"; -} - -.glyphicon-sound-5-1:before { - content: "\e191"; -} - -.glyphicon-sound-6-1:before { - content: "\e192"; -} - -.glyphicon-sound-7-1:before { - content: "\e193"; -} - -.glyphicon-copyright-mark:before { - content: "\e194"; -} - -.glyphicon-registration-mark:before { - content: "\e195"; -} - -.glyphicon-cloud-download:before { - content: "\e197"; -} - -.glyphicon-cloud-upload:before { - content: "\e198"; -} - -.glyphicon-tree-conifer:before { - content: "\e199"; -} - -.glyphicon-tree-deciduous:before { - content: "\e200"; -} - -.glyphicon-cd:before { - content: "\e201"; -} - -.glyphicon-save-file:before { - content: "\e202"; -} - -.glyphicon-open-file:before { - content: "\e203"; -} - -.glyphicon-level-up:before { - content: "\e204"; -} - -.glyphicon-copy:before { - content: "\e205"; -} - -.glyphicon-paste:before { - content: "\e206"; -} - -.glyphicon-alert:before { - content: "\e209"; -} - -.glyphicon-equalizer:before { - content: "\e210"; -} - -.glyphicon-king:before { - content: "\e211"; -} - -.glyphicon-queen:before { - content: "\e212"; -} - -.glyphicon-pawn:before { - content: "\e213"; -} - -.glyphicon-bishop:before { - content: "\e214"; -} - -.glyphicon-knight:before { - content: "\e215"; -} - -.glyphicon-baby-formula:before { - content: "\e216"; -} - -.glyphicon-tent:before { - content: "\26fa"; -} - -.glyphicon-blackboard:before { - content: "\e218"; -} - -.glyphicon-bed:before { - content: "\e219"; -} - -.glyphicon-apple:before { - content: "\f8ff"; -} - -.glyphicon-erase:before { - content: "\e221"; -} - -.glyphicon-hourglass:before { - content: "\231b"; -} - -.glyphicon-lamp:before { - content: "\e223"; -} - -.glyphicon-duplicate:before { - content: "\e224"; -} - -.glyphicon-piggy-bank:before { - content: "\e225"; -} - -.glyphicon-scissors:before { - content: "\e226"; -} - -.glyphicon-bitcoin:before { - content: "\e227"; -} - -.glyphicon-btc:before { - content: "\e227"; -} - -.glyphicon-xbt:before { - content: "\e227"; -} - -.glyphicon-yen:before { - content: "\00a5"; -} - -.glyphicon-jpy:before { - content: "\00a5"; -} - -.glyphicon-ruble:before { - content: "\20bd"; -} - -.glyphicon-rub:before { - content: "\20bd"; -} - -.glyphicon-scale:before { - content: "\e230"; -} - -.glyphicon-ice-lolly:before { - content: "\e231"; -} - -.glyphicon-ice-lolly-tasted:before { - content: "\e232"; -} - -.glyphicon-education:before { - content: "\e233"; -} - -.glyphicon-option-horizontal:before { - content: "\e234"; -} - -.glyphicon-option-vertical:before { - content: "\e235"; -} - -.glyphicon-menu-hamburger:before { - content: "\e236"; -} - -.glyphicon-modal-window:before { - content: "\e237"; -} - -.glyphicon-oil:before { - content: "\e238"; -} - -.glyphicon-grain:before { - content: "\e239"; -} - -.glyphicon-sunglasses:before { - content: "\e240"; -} - -.glyphicon-text-size:before { - content: "\e241"; -} - -.glyphicon-text-color:before { - content: "\e242"; -} - -.glyphicon-text-background:before { - content: "\e243"; -} - -.glyphicon-object-align-top:before { - content: "\e244"; -} - -.glyphicon-object-align-bottom:before { - content: "\e245"; -} - -.glyphicon-object-align-horizontal:before { - content: "\e246"; -} - -.glyphicon-object-align-left:before { - content: "\e247"; -} - -.glyphicon-object-align-vertical:before { - content: "\e248"; -} - -.glyphicon-object-align-right:before { - content: "\e249"; -} - -.glyphicon-triangle-right:before { - content: "\e250"; -} - -.glyphicon-triangle-left:before { - content: "\e251"; -} - -.glyphicon-triangle-bottom:before { - content: "\e252"; -} - -.glyphicon-triangle-top:before { - content: "\e253"; -} - -.glyphicon-console:before { - content: "\e254"; -} - -.glyphicon-superscript:before { - content: "\e255"; -} - -.glyphicon-subscript:before { - content: "\e256"; -} - -.glyphicon-menu-left:before { - content: "\e257"; -} - -.glyphicon-menu-right:before { - content: "\e258"; -} - -.glyphicon-menu-down:before { - content: "\e259"; -} - -.glyphicon-menu-up:before { - content: "\e260"; -} - -* { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -*:before, -*:after { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -html { - font-size: 10px; - -webkit-tap-highlight-color: transparent; -} - -body { - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 14px; - line-height: 1.42857143; - color: #c6c6c6; - background-color: #2f2f2f; -} - -input, -button, -select, -textarea { - font-family: inherit; - font-size: inherit; - line-height: inherit; -} - -a { - color: #08c; - text-decoration: none; -} -a:hover, a:focus { - color: #1ab3ff; - text-decoration: underline; -} -a:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} - -figure { - margin: 0; -} - -img { - vertical-align: middle; -} - -.img-responsive { - display: block; - max-width: 100%; - height: auto; -} - -.img-rounded { - border-radius: 6px; -} - -.img-thumbnail { - padding: 4px; - line-height: 1.42857143; - background-color: #2f2f2f; - border: 1px solid #ddd; - border-radius: 4px; - -webkit-transition: all 0.2s ease-in-out; - -o-transition: all 0.2s ease-in-out; - transition: all 0.2s ease-in-out; - display: inline-block; - max-width: 100%; - height: auto; -} - -.img-circle { - border-radius: 50%; -} - -hr { - margin-top: 20px; - margin-bottom: 20px; - border: 0; - border-top: 1px solid #eeeeee; -} - -.sr-only { - position: absolute; - width: 1px; - height: 1px; - margin: -1px; - padding: 0; - overflow: hidden; - clip: rect(0, 0, 0, 0); - border: 0; -} - -.sr-only-focusable:active, .sr-only-focusable:focus { - position: static; - width: auto; - height: auto; - margin: 0; - overflow: visible; - clip: auto; -} - -[role="button"] { - cursor: pointer; -} - -h1, h2, h3, h4, h5, h6, -.h1, .h2, .h3, .h4, .h5, .h6 { - font-family: inherit; - font-weight: 500; - line-height: 1.1; - color: inherit; -} -h1 small, -h1 .small, h2 small, -h2 .small, h3 small, -h3 .small, h4 small, -h4 .small, h5 small, -h5 .small, h6 small, -h6 .small, -.h1 small, -.h1 .small, .h2 small, -.h2 .small, .h3 small, -.h3 .small, .h4 small, -.h4 .small, .h5 small, -.h5 .small, .h6 small, -.h6 .small { - font-weight: normal; - line-height: 1; - color: #777777; -} - -h1, .h1, -h2, .h2, -h3, .h3 { - margin-top: 20px; - margin-bottom: 10px; -} -h1 small, -h1 .small, .h1 small, -.h1 .small, -h2 small, -h2 .small, .h2 small, -.h2 .small, -h3 small, -h3 .small, .h3 small, -.h3 .small { - font-size: 65%; -} - -h4, .h4, -h5, .h5, -h6, .h6 { - margin-top: 10px; - margin-bottom: 10px; -} -h4 small, -h4 .small, .h4 small, -.h4 .small, -h5 small, -h5 .small, .h5 small, -.h5 .small, -h6 small, -h6 .small, .h6 small, -.h6 .small { - font-size: 75%; -} - -h1, .h1 { - font-size: 36px; -} - -h2, .h2 { - font-size: 30px; -} - -h3, .h3 { - font-size: 24px; -} - -h4, .h4 { - font-size: 18px; -} - -h5, .h5 { - font-size: 14px; -} - -h6, .h6 { - font-size: 12px; -} - -p { - margin: 0 0 10px; -} - -.lead { - margin-bottom: 20px; - font-size: 16px; - font-weight: 300; - line-height: 1.4; -} -@media (min-width: 768px) { - .lead { - font-size: 21px; - } -} - -small, -.small { - font-size: 85%; -} - -mark, -.mark { - background-color: #fcf8e3; - padding: .2em; -} - -.text-left { - text-align: left; -} - -.text-right { - text-align: right; -} - -.text-center { - text-align: center; -} - -.text-justify { - text-align: justify; -} - -.text-nowrap { - white-space: nowrap; -} - -.text-lowercase { - text-transform: lowercase; -} - -.text-uppercase, .initialism { - text-transform: uppercase; -} - -.text-capitalize { - text-transform: capitalize; -} - -.text-muted { - color: #777777; -} - -.text-primary { - color: #337ab7; -} - -a.text-primary:hover, -a.text-primary:focus { - color: #286090; -} - -.text-success { - color: #3c763d; -} - -a.text-success:hover, -a.text-success:focus { - color: #2b542c; -} - -.text-info { - color: #31708f; -} - -a.text-info:hover, -a.text-info:focus { - color: #245269; -} - -.text-warning { - color: #8a6d3b; -} - -a.text-warning:hover, -a.text-warning:focus { - color: #66512c; -} - -.text-danger { - color: #a94442; -} - -a.text-danger:hover, -a.text-danger:focus { - color: #843534; -} - -.bg-primary { - color: #fff; -} - -.bg-primary { - background-color: #337ab7; -} - -a.bg-primary:hover, -a.bg-primary:focus { - background-color: #286090; -} - -.bg-success { - background-color: #dff0d8; -} - -a.bg-success:hover, -a.bg-success:focus { - background-color: #c1e2b3; -} - -.bg-info { - background-color: #d9edf7; -} - -a.bg-info:hover, -a.bg-info:focus { - background-color: #afd9ee; -} - -.bg-warning { - background-color: #fcf8e3; -} - -a.bg-warning:hover, -a.bg-warning:focus { - background-color: #f7ecb5; -} - -.bg-danger { - background-color: #f2dede; -} - -a.bg-danger:hover, -a.bg-danger:focus { - background-color: #e4b9b9; -} - -.page-header { - padding-bottom: 9px; - margin: 40px 0 20px; - border-bottom: 1px solid #eeeeee; -} - -ul, -ol { - margin-top: 0; - margin-bottom: 10px; -} -ul ul, -ul ol, -ol ul, -ol ol { - margin-bottom: 0; -} - -.list-unstyled { - padding-left: 0; - list-style: none; -} - -.list-inline { - padding-left: 0; - list-style: none; - margin-left: -5px; -} -.list-inline > li { - display: inline-block; - padding-left: 5px; - padding-right: 5px; -} - -dl { - margin-top: 0; - margin-bottom: 20px; -} - -dt, -dd { - line-height: 1.42857143; -} - -dt { - font-weight: bold; -} - -dd { - margin-left: 0; -} - -.dl-horizontal dd:before, .dl-horizontal dd:after { - content: " "; - display: table; -} -.dl-horizontal dd:after { - clear: both; -} -@media (min-width: 768px) { - .dl-horizontal dt { - float: left; - width: 160px; - clear: left; - text-align: right; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - } - .dl-horizontal dd { - margin-left: 180px; - } -} - -abbr[title], -abbr[data-original-title] { - cursor: help; - border-bottom: 1px dotted #777777; -} - -.initialism { - font-size: 90%; -} - -blockquote { - padding: 10px 20px; - margin: 0 0 20px; - font-size: 17.5px; - border-left: 5px solid #eeeeee; -} -blockquote p:last-child, -blockquote ul:last-child, -blockquote ol:last-child { - margin-bottom: 0; -} -blockquote footer, -blockquote small, -blockquote .small { - display: block; - font-size: 80%; - line-height: 1.42857143; - color: #777777; -} -blockquote footer:before, -blockquote small:before, -blockquote .small:before { - content: '\2014 \00A0'; -} - -.blockquote-reverse, -blockquote.pull-right { - padding-right: 15px; - padding-left: 0; - border-right: 5px solid #eeeeee; - border-left: 0; - text-align: right; -} -.blockquote-reverse footer:before, -.blockquote-reverse small:before, -.blockquote-reverse .small:before, -blockquote.pull-right footer:before, -blockquote.pull-right small:before, -blockquote.pull-right .small:before { - content: ''; -} -.blockquote-reverse footer:after, -.blockquote-reverse small:after, -.blockquote-reverse .small:after, -blockquote.pull-right footer:after, -blockquote.pull-right small:after, -blockquote.pull-right .small:after { - content: '\00A0 \2014'; -} - -address { - margin-bottom: 20px; - font-style: normal; - line-height: 1.42857143; -} - -code, -kbd, -pre, -samp { - font-family: Menlo, Monaco, Consolas, "Courier New", monospace; -} - -code { - padding: 2px 4px; - font-size: 90%; - color: #c7254e; - background-color: #f9f2f4; - border-radius: 4px; -} - -kbd { - padding: 2px 4px; - font-size: 90%; - color: #fff; - background-color: #333; - border-radius: 3px; - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); -} -kbd kbd { - padding: 0; - font-size: 100%; - font-weight: bold; - box-shadow: none; -} - -pre { - display: block; - padding: 9.5px; - margin: 0 0 10px; - font-size: 13px; - line-height: 1.42857143; - word-break: break-all; - word-wrap: break-word; - color: #333333; - background-color: #f5f5f5; - border: 1px solid #ccc; - border-radius: 4px; -} -pre code { - padding: 0; - font-size: inherit; - color: inherit; - white-space: pre-wrap; - background-color: transparent; - border-radius: 0; -} - -.pre-scrollable { - max-height: 340px; - overflow-y: scroll; -} - -.container { - margin-right: auto; - margin-left: auto; - padding-left: 15px; - padding-right: 15px; -} -.container:before, .container:after { - content: " "; - display: table; -} -.container:after { - clear: both; -} -@media (min-width: 768px) { - .container { - width: 750px; - } -} -@media (min-width: 992px) { - .container { - width: 970px; - } -} -@media (min-width: 1200px) { - .container { - width: 1170px; - } -} - -.container-fluid { - margin-right: auto; - margin-left: auto; - padding-left: 15px; - padding-right: 15px; -} -.container-fluid:before, .container-fluid:after { - content: " "; - display: table; -} -.container-fluid:after { - clear: both; -} - -.row { - margin-left: -15px; - margin-right: -15px; -} -.row:before, .row:after { - content: " "; - display: table; -} -.row:after { - clear: both; -} - -.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { - position: relative; - min-height: 1px; - padding-left: 15px; - padding-right: 15px; -} - -.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { - float: left; -} - -.col-xs-1 { - width: 8.33333333%; -} - -.col-xs-2 { - width: 16.66666667%; -} - -.col-xs-3 { - width: 25%; -} - -.col-xs-4 { - width: 33.33333333%; -} - -.col-xs-5 { - width: 41.66666667%; -} - -.col-xs-6 { - width: 50%; -} - -.col-xs-7 { - width: 58.33333333%; -} - -.col-xs-8 { - width: 66.66666667%; -} - -.col-xs-9 { - width: 75%; -} - -.col-xs-10 { - width: 83.33333333%; -} - -.col-xs-11 { - width: 91.66666667%; -} - -.col-xs-12 { - width: 100%; -} - -.col-xs-pull-0 { - right: auto; -} - -.col-xs-pull-1 { - right: 8.33333333%; -} - -.col-xs-pull-2 { - right: 16.66666667%; -} - -.col-xs-pull-3 { - right: 25%; -} - -.col-xs-pull-4 { - right: 33.33333333%; -} - -.col-xs-pull-5 { - right: 41.66666667%; -} - -.col-xs-pull-6 { - right: 50%; -} - -.col-xs-pull-7 { - right: 58.33333333%; -} - -.col-xs-pull-8 { - right: 66.66666667%; -} - -.col-xs-pull-9 { - right: 75%; -} - -.col-xs-pull-10 { - right: 83.33333333%; -} - -.col-xs-pull-11 { - right: 91.66666667%; -} - -.col-xs-pull-12 { - right: 100%; -} - -.col-xs-push-0 { - left: auto; -} - -.col-xs-push-1 { - left: 8.33333333%; -} - -.col-xs-push-2 { - left: 16.66666667%; -} - -.col-xs-push-3 { - left: 25%; -} - -.col-xs-push-4 { - left: 33.33333333%; -} - -.col-xs-push-5 { - left: 41.66666667%; -} - -.col-xs-push-6 { - left: 50%; -} - -.col-xs-push-7 { - left: 58.33333333%; -} - -.col-xs-push-8 { - left: 66.66666667%; -} - -.col-xs-push-9 { - left: 75%; -} - -.col-xs-push-10 { - left: 83.33333333%; -} - -.col-xs-push-11 { - left: 91.66666667%; -} - -.col-xs-push-12 { - left: 100%; -} - -.col-xs-offset-0 { - margin-left: 0%; -} - -.col-xs-offset-1 { - margin-left: 8.33333333%; -} - -.col-xs-offset-2 { - margin-left: 16.66666667%; -} - -.col-xs-offset-3 { - margin-left: 25%; -} - -.col-xs-offset-4 { - margin-left: 33.33333333%; -} - -.col-xs-offset-5 { - margin-left: 41.66666667%; -} - -.col-xs-offset-6 { - margin-left: 50%; -} - -.col-xs-offset-7 { - margin-left: 58.33333333%; -} - -.col-xs-offset-8 { - margin-left: 66.66666667%; -} - -.col-xs-offset-9 { - margin-left: 75%; -} - -.col-xs-offset-10 { - margin-left: 83.33333333%; -} - -.col-xs-offset-11 { - margin-left: 91.66666667%; -} - -.col-xs-offset-12 { - margin-left: 100%; -} - -@media (min-width: 768px) { - .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { - float: left; - } - - .col-sm-1 { - width: 8.33333333%; - } - - .col-sm-2 { - width: 16.66666667%; - } - - .col-sm-3 { - width: 25%; - } - - .col-sm-4 { - width: 33.33333333%; - } - - .col-sm-5 { - width: 41.66666667%; - } - - .col-sm-6 { - width: 50%; - } - - .col-sm-7 { - width: 58.33333333%; - } - - .col-sm-8 { - width: 66.66666667%; - } - - .col-sm-9 { - width: 75%; - } - - .col-sm-10 { - width: 83.33333333%; - } - - .col-sm-11 { - width: 91.66666667%; - } - - .col-sm-12 { - width: 100%; - } - - .col-sm-pull-0 { - right: auto; - } - - .col-sm-pull-1 { - right: 8.33333333%; - } - - .col-sm-pull-2 { - right: 16.66666667%; - } - - .col-sm-pull-3 { - right: 25%; - } - - .col-sm-pull-4 { - right: 33.33333333%; - } - - .col-sm-pull-5 { - right: 41.66666667%; - } - - .col-sm-pull-6 { - right: 50%; - } - - .col-sm-pull-7 { - right: 58.33333333%; - } - - .col-sm-pull-8 { - right: 66.66666667%; - } - - .col-sm-pull-9 { - right: 75%; - } - - .col-sm-pull-10 { - right: 83.33333333%; - } - - .col-sm-pull-11 { - right: 91.66666667%; - } - - .col-sm-pull-12 { - right: 100%; - } - - .col-sm-push-0 { - left: auto; - } - - .col-sm-push-1 { - left: 8.33333333%; - } - - .col-sm-push-2 { - left: 16.66666667%; - } - - .col-sm-push-3 { - left: 25%; - } - - .col-sm-push-4 { - left: 33.33333333%; - } - - .col-sm-push-5 { - left: 41.66666667%; - } - - .col-sm-push-6 { - left: 50%; - } - - .col-sm-push-7 { - left: 58.33333333%; - } - - .col-sm-push-8 { - left: 66.66666667%; - } - - .col-sm-push-9 { - left: 75%; - } - - .col-sm-push-10 { - left: 83.33333333%; - } - - .col-sm-push-11 { - left: 91.66666667%; - } - - .col-sm-push-12 { - left: 100%; - } - - .col-sm-offset-0 { - margin-left: 0%; - } - - .col-sm-offset-1 { - margin-left: 8.33333333%; - } - - .col-sm-offset-2 { - margin-left: 16.66666667%; - } - - .col-sm-offset-3 { - margin-left: 25%; - } - - .col-sm-offset-4 { - margin-left: 33.33333333%; - } - - .col-sm-offset-5 { - margin-left: 41.66666667%; - } - - .col-sm-offset-6 { - margin-left: 50%; - } - - .col-sm-offset-7 { - margin-left: 58.33333333%; - } - - .col-sm-offset-8 { - margin-left: 66.66666667%; - } - - .col-sm-offset-9 { - margin-left: 75%; - } - - .col-sm-offset-10 { - margin-left: 83.33333333%; - } - - .col-sm-offset-11 { - margin-left: 91.66666667%; - } - - .col-sm-offset-12 { - margin-left: 100%; - } -} -@media (min-width: 992px) { - .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { - float: left; - } - - .col-md-1 { - width: 8.33333333%; - } - - .col-md-2 { - width: 16.66666667%; - } - - .col-md-3 { - width: 25%; - } - - .col-md-4 { - width: 33.33333333%; - } - - .col-md-5 { - width: 41.66666667%; - } - - .col-md-6 { - width: 50%; - } - - .col-md-7 { - width: 58.33333333%; - } - - .col-md-8 { - width: 66.66666667%; - } - - .col-md-9 { - width: 75%; - } - - .col-md-10 { - width: 83.33333333%; - } - - .col-md-11 { - width: 91.66666667%; - } - - .col-md-12 { - width: 100%; - } - - .col-md-pull-0 { - right: auto; - } - - .col-md-pull-1 { - right: 8.33333333%; - } - - .col-md-pull-2 { - right: 16.66666667%; - } - - .col-md-pull-3 { - right: 25%; - } - - .col-md-pull-4 { - right: 33.33333333%; - } - - .col-md-pull-5 { - right: 41.66666667%; - } - - .col-md-pull-6 { - right: 50%; - } - - .col-md-pull-7 { - right: 58.33333333%; - } - - .col-md-pull-8 { - right: 66.66666667%; - } - - .col-md-pull-9 { - right: 75%; - } - - .col-md-pull-10 { - right: 83.33333333%; - } - - .col-md-pull-11 { - right: 91.66666667%; - } - - .col-md-pull-12 { - right: 100%; - } - - .col-md-push-0 { - left: auto; - } - - .col-md-push-1 { - left: 8.33333333%; - } - - .col-md-push-2 { - left: 16.66666667%; - } - - .col-md-push-3 { - left: 25%; - } - - .col-md-push-4 { - left: 33.33333333%; - } - - .col-md-push-5 { - left: 41.66666667%; - } - - .col-md-push-6 { - left: 50%; - } - - .col-md-push-7 { - left: 58.33333333%; - } - - .col-md-push-8 { - left: 66.66666667%; - } - - .col-md-push-9 { - left: 75%; - } - - .col-md-push-10 { - left: 83.33333333%; - } - - .col-md-push-11 { - left: 91.66666667%; - } - - .col-md-push-12 { - left: 100%; - } - - .col-md-offset-0 { - margin-left: 0%; - } - - .col-md-offset-1 { - margin-left: 8.33333333%; - } - - .col-md-offset-2 { - margin-left: 16.66666667%; - } - - .col-md-offset-3 { - margin-left: 25%; - } - - .col-md-offset-4 { - margin-left: 33.33333333%; - } - - .col-md-offset-5 { - margin-left: 41.66666667%; - } - - .col-md-offset-6 { - margin-left: 50%; - } - - .col-md-offset-7 { - margin-left: 58.33333333%; - } - - .col-md-offset-8 { - margin-left: 66.66666667%; - } - - .col-md-offset-9 { - margin-left: 75%; - } - - .col-md-offset-10 { - margin-left: 83.33333333%; - } - - .col-md-offset-11 { - margin-left: 91.66666667%; - } - - .col-md-offset-12 { - margin-left: 100%; - } -} -@media (min-width: 1200px) { - .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { - float: left; - } - - .col-lg-1 { - width: 8.33333333%; - } - - .col-lg-2 { - width: 16.66666667%; - } - - .col-lg-3 { - width: 25%; - } - - .col-lg-4 { - width: 33.33333333%; - } - - .col-lg-5 { - width: 41.66666667%; - } - - .col-lg-6 { - width: 50%; - } - - .col-lg-7 { - width: 58.33333333%; - } - - .col-lg-8 { - width: 66.66666667%; - } - - .col-lg-9 { - width: 75%; - } - - .col-lg-10 { - width: 83.33333333%; - } - - .col-lg-11 { - width: 91.66666667%; - } - - .col-lg-12 { - width: 100%; - } - - .col-lg-pull-0 { - right: auto; - } - - .col-lg-pull-1 { - right: 8.33333333%; - } - - .col-lg-pull-2 { - right: 16.66666667%; - } - - .col-lg-pull-3 { - right: 25%; - } - - .col-lg-pull-4 { - right: 33.33333333%; - } - - .col-lg-pull-5 { - right: 41.66666667%; - } - - .col-lg-pull-6 { - right: 50%; - } - - .col-lg-pull-7 { - right: 58.33333333%; - } - - .col-lg-pull-8 { - right: 66.66666667%; - } - - .col-lg-pull-9 { - right: 75%; - } - - .col-lg-pull-10 { - right: 83.33333333%; - } - - .col-lg-pull-11 { - right: 91.66666667%; - } - - .col-lg-pull-12 { - right: 100%; - } - - .col-lg-push-0 { - left: auto; - } - - .col-lg-push-1 { - left: 8.33333333%; - } - - .col-lg-push-2 { - left: 16.66666667%; - } - - .col-lg-push-3 { - left: 25%; - } - - .col-lg-push-4 { - left: 33.33333333%; - } - - .col-lg-push-5 { - left: 41.66666667%; - } - - .col-lg-push-6 { - left: 50%; - } - - .col-lg-push-7 { - left: 58.33333333%; - } - - .col-lg-push-8 { - left: 66.66666667%; - } - - .col-lg-push-9 { - left: 75%; - } - - .col-lg-push-10 { - left: 83.33333333%; - } - - .col-lg-push-11 { - left: 91.66666667%; - } - - .col-lg-push-12 { - left: 100%; - } - - .col-lg-offset-0 { - margin-left: 0%; - } - - .col-lg-offset-1 { - margin-left: 8.33333333%; - } - - .col-lg-offset-2 { - margin-left: 16.66666667%; - } - - .col-lg-offset-3 { - margin-left: 25%; - } - - .col-lg-offset-4 { - margin-left: 33.33333333%; - } - - .col-lg-offset-5 { - margin-left: 41.66666667%; - } - - .col-lg-offset-6 { - margin-left: 50%; - } - - .col-lg-offset-7 { - margin-left: 58.33333333%; - } - - .col-lg-offset-8 { - margin-left: 66.66666667%; - } - - .col-lg-offset-9 { - margin-left: 75%; - } - - .col-lg-offset-10 { - margin-left: 83.33333333%; - } - - .col-lg-offset-11 { - margin-left: 91.66666667%; - } - - .col-lg-offset-12 { - margin-left: 100%; - } -} -table { - background-color: transparent; -} - -caption { - padding-top: 8px; - padding-bottom: 8px; - color: #777777; - text-align: left; -} - -th { - text-align: left; -} - -.table { - width: 100%; - max-width: 100%; - margin-bottom: 20px; -} -.table > thead > tr > th, -.table > thead > tr > td, -.table > tbody > tr > th, -.table > tbody > tr > td, -.table > tfoot > tr > th, -.table > tfoot > tr > td { - padding: 8px; - line-height: 1.42857143; - vertical-align: top; - border-top: 1px solid #ddd; -} -.table > thead > tr > th { - vertical-align: bottom; - border-bottom: 2px solid #ddd; -} -.table > caption + thead > tr:first-child > th, -.table > caption + thead > tr:first-child > td, -.table > colgroup + thead > tr:first-child > th, -.table > colgroup + thead > tr:first-child > td, -.table > thead:first-child > tr:first-child > th, -.table > thead:first-child > tr:first-child > td { - border-top: 0; -} -.table > tbody + tbody { - border-top: 2px solid #ddd; -} -.table .table { - background-color: #2f2f2f; -} - -.table-condensed > thead > tr > th, -.table-condensed > thead > tr > td, -.table-condensed > tbody > tr > th, -.table-condensed > tbody > tr > td, -.table-condensed > tfoot > tr > th, -.table-condensed > tfoot > tr > td { - padding: 5px; -} - -.table-bordered { - border: 1px solid #ddd; -} -.table-bordered > thead > tr > th, -.table-bordered > thead > tr > td, -.table-bordered > tbody > tr > th, -.table-bordered > tbody > tr > td, -.table-bordered > tfoot > tr > th, -.table-bordered > tfoot > tr > td { - border: 1px solid #ddd; -} -.table-bordered > thead > tr > th, -.table-bordered > thead > tr > td { - border-bottom-width: 2px; -} - -.table-striped > tbody > tr:nth-of-type(odd) { - background-color: #f9f9f9; -} - -.table-hover > tbody > tr:hover { - background-color: #f5f5f5; -} - -table col[class*="col-"] { - position: static; - float: none; - display: table-column; -} - -table td[class*="col-"], -table th[class*="col-"] { - position: static; - float: none; - display: table-cell; -} - -.table > thead > tr > td.active, -.table > thead > tr > th.active, .table > thead > tr.active > td, .table > thead > tr.active > th, -.table > tbody > tr > td.active, -.table > tbody > tr > th.active, -.table > tbody > tr.active > td, -.table > tbody > tr.active > th, -.table > tfoot > tr > td.active, -.table > tfoot > tr > th.active, -.table > tfoot > tr.active > td, -.table > tfoot > tr.active > th { - background-color: #f5f5f5; -} - -.table-hover > tbody > tr > td.active:hover, -.table-hover > tbody > tr > th.active:hover, .table-hover > tbody > tr.active:hover > td, .table-hover > tbody > tr:hover > .active, .table-hover > tbody > tr.active:hover > th { - background-color: #e8e8e8; -} - -.table > thead > tr > td.success, -.table > thead > tr > th.success, .table > thead > tr.success > td, .table > thead > tr.success > th, -.table > tbody > tr > td.success, -.table > tbody > tr > th.success, -.table > tbody > tr.success > td, -.table > tbody > tr.success > th, -.table > tfoot > tr > td.success, -.table > tfoot > tr > th.success, -.table > tfoot > tr.success > td, -.table > tfoot > tr.success > th { - background-color: #dff0d8; -} - -.table-hover > tbody > tr > td.success:hover, -.table-hover > tbody > tr > th.success:hover, .table-hover > tbody > tr.success:hover > td, .table-hover > tbody > tr:hover > .success, .table-hover > tbody > tr.success:hover > th { - background-color: #d0e9c6; -} - -.table > thead > tr > td.info, -.table > thead > tr > th.info, .table > thead > tr.info > td, .table > thead > tr.info > th, -.table > tbody > tr > td.info, -.table > tbody > tr > th.info, -.table > tbody > tr.info > td, -.table > tbody > tr.info > th, -.table > tfoot > tr > td.info, -.table > tfoot > tr > th.info, -.table > tfoot > tr.info > td, -.table > tfoot > tr.info > th { - background-color: #d9edf7; -} - -.table-hover > tbody > tr > td.info:hover, -.table-hover > tbody > tr > th.info:hover, .table-hover > tbody > tr.info:hover > td, .table-hover > tbody > tr:hover > .info, .table-hover > tbody > tr.info:hover > th { - background-color: #c4e3f3; -} - -.table > thead > tr > td.warning, -.table > thead > tr > th.warning, .table > thead > tr.warning > td, .table > thead > tr.warning > th, -.table > tbody > tr > td.warning, -.table > tbody > tr > th.warning, -.table > tbody > tr.warning > td, -.table > tbody > tr.warning > th, -.table > tfoot > tr > td.warning, -.table > tfoot > tr > th.warning, -.table > tfoot > tr.warning > td, -.table > tfoot > tr.warning > th { - background-color: #fcf8e3; -} - -.table-hover > tbody > tr > td.warning:hover, -.table-hover > tbody > tr > th.warning:hover, .table-hover > tbody > tr.warning:hover > td, .table-hover > tbody > tr:hover > .warning, .table-hover > tbody > tr.warning:hover > th { - background-color: #faf2cc; -} - -.table > thead > tr > td.danger, -.table > thead > tr > th.danger, .table > thead > tr.danger > td, .table > thead > tr.danger > th, -.table > tbody > tr > td.danger, -.table > tbody > tr > th.danger, -.table > tbody > tr.danger > td, -.table > tbody > tr.danger > th, -.table > tfoot > tr > td.danger, -.table > tfoot > tr > th.danger, -.table > tfoot > tr.danger > td, -.table > tfoot > tr.danger > th { - background-color: #f2dede; -} - -.table-hover > tbody > tr > td.danger:hover, -.table-hover > tbody > tr > th.danger:hover, .table-hover > tbody > tr.danger:hover > td, .table-hover > tbody > tr:hover > .danger, .table-hover > tbody > tr.danger:hover > th { - background-color: #ebcccc; -} - -.table-responsive { - overflow-x: auto; - min-height: 0.01%; -} -@media screen and (max-width: 767px) { - .table-responsive { - width: 100%; - margin-bottom: 15px; - overflow-y: hidden; - -ms-overflow-style: -ms-autohiding-scrollbar; - border: 1px solid #ddd; - } - .table-responsive > .table { - margin-bottom: 0; - } - .table-responsive > .table > thead > tr > th, - .table-responsive > .table > thead > tr > td, - .table-responsive > .table > tbody > tr > th, - .table-responsive > .table > tbody > tr > td, - .table-responsive > .table > tfoot > tr > th, - .table-responsive > .table > tfoot > tr > td { - white-space: nowrap; - } - .table-responsive > .table-bordered { - border: 0; - } - .table-responsive > .table-bordered > thead > tr > th:first-child, - .table-responsive > .table-bordered > thead > tr > td:first-child, - .table-responsive > .table-bordered > tbody > tr > th:first-child, - .table-responsive > .table-bordered > tbody > tr > td:first-child, - .table-responsive > .table-bordered > tfoot > tr > th:first-child, - .table-responsive > .table-bordered > tfoot > tr > td:first-child { - border-left: 0; - } - .table-responsive > .table-bordered > thead > tr > th:last-child, - .table-responsive > .table-bordered > thead > tr > td:last-child, - .table-responsive > .table-bordered > tbody > tr > th:last-child, - .table-responsive > .table-bordered > tbody > tr > td:last-child, - .table-responsive > .table-bordered > tfoot > tr > th:last-child, - .table-responsive > .table-bordered > tfoot > tr > td:last-child { - border-right: 0; - } - .table-responsive > .table-bordered > tbody > tr:last-child > th, - .table-responsive > .table-bordered > tbody > tr:last-child > td, - .table-responsive > .table-bordered > tfoot > tr:last-child > th, - .table-responsive > .table-bordered > tfoot > tr:last-child > td { - border-bottom: 0; - } -} - -fieldset { - padding: 0; - margin: 0; - border: 0; - min-width: 0; -} - -legend { - display: block; - width: 100%; - padding: 0; - margin-bottom: 20px; - font-size: 21px; - line-height: inherit; - color: #333333; - border: 0; - border-bottom: 1px solid #e5e5e5; -} - -label { - display: inline-block; - max-width: 100%; - margin-bottom: 5px; - font-weight: bold; -} - -input[type="search"] { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -input[type="radio"], -input[type="checkbox"] { - margin: 4px 0 0; - margin-top: 1px \9; - line-height: normal; -} - -input[type="file"] { - display: block; -} - -input[type="range"] { - display: block; - width: 100%; -} - -select[multiple], -select[size] { - height: auto; -} - -input[type="file"]:focus, -input[type="radio"]:focus, -input[type="checkbox"]:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} - -output { - display: block; - padding-top: 7px; - font-size: 14px; - line-height: 1.42857143; - color: #555555; -} - -.form-control { - display: block; - width: 100%; - height: 34px; - padding: 6px 12px; - font-size: 14px; - line-height: 1.42857143; - color: #555555; - background-color: #fff; - background-image: none; - border: 1px solid #ccc; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; - -o-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; - transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; -} -.form-control:focus { - border-color: #66afe9; - outline: 0; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); -} -.form-control::-moz-placeholder { - color: #999; - opacity: 1; -} -.form-control:-ms-input-placeholder { - color: #999; -} -.form-control::-webkit-input-placeholder { - color: #999; -} -.form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control { - background-color: #eeeeee; - opacity: 1; -} -.form-control[disabled], fieldset[disabled] .form-control { - cursor: not-allowed; -} - -textarea.form-control { - height: auto; -} - -input[type="search"] { - -webkit-appearance: none; -} - -@media screen and (-webkit-min-device-pixel-ratio: 0) { - input[type="date"].form-control, - input[type="time"].form-control, - input[type="datetime-local"].form-control, - input[type="month"].form-control { - line-height: 34px; - } - input[type="date"].input-sm, .input-group-sm > input[type="date"].form-control, - .input-group-sm > input[type="date"].input-group-addon, - .input-group-sm > .input-group-btn > input[type="date"].btn, .input-group-sm input[type="date"], - input[type="time"].input-sm, - .input-group-sm > input[type="time"].form-control, - .input-group-sm > input[type="time"].input-group-addon, - .input-group-sm > .input-group-btn > input[type="time"].btn, .input-group-sm - input[type="time"], - input[type="datetime-local"].input-sm, - .input-group-sm > input[type="datetime-local"].form-control, - .input-group-sm > input[type="datetime-local"].input-group-addon, - .input-group-sm > .input-group-btn > input[type="datetime-local"].btn, .input-group-sm - input[type="datetime-local"], - input[type="month"].input-sm, - .input-group-sm > input[type="month"].form-control, - .input-group-sm > input[type="month"].input-group-addon, - .input-group-sm > .input-group-btn > input[type="month"].btn, .input-group-sm - input[type="month"] { - line-height: 30px; - } - input[type="date"].input-lg, .input-group-lg > input[type="date"].form-control, - .input-group-lg > input[type="date"].input-group-addon, - .input-group-lg > .input-group-btn > input[type="date"].btn, .input-group-lg input[type="date"], - input[type="time"].input-lg, - .input-group-lg > input[type="time"].form-control, - .input-group-lg > input[type="time"].input-group-addon, - .input-group-lg > .input-group-btn > input[type="time"].btn, .input-group-lg - input[type="time"], - input[type="datetime-local"].input-lg, - .input-group-lg > input[type="datetime-local"].form-control, - .input-group-lg > input[type="datetime-local"].input-group-addon, - .input-group-lg > .input-group-btn > input[type="datetime-local"].btn, .input-group-lg - input[type="datetime-local"], - input[type="month"].input-lg, - .input-group-lg > input[type="month"].form-control, - .input-group-lg > input[type="month"].input-group-addon, - .input-group-lg > .input-group-btn > input[type="month"].btn, .input-group-lg - input[type="month"] { - line-height: 46px; - } -} -.form-group { - margin-bottom: 15px; -} - -.radio, -.checkbox { - position: relative; - display: block; - margin-top: 10px; - margin-bottom: 10px; -} -.radio label, -.checkbox label { - min-height: 20px; - padding-left: 20px; - margin-bottom: 0; - font-weight: normal; - cursor: pointer; -} - -.radio input[type="radio"], -.radio-inline input[type="radio"], -.checkbox input[type="checkbox"], -.checkbox-inline input[type="checkbox"] { - position: absolute; - margin-left: -20px; - margin-top: 4px \9; -} - -.radio + .radio, -.checkbox + .checkbox { - margin-top: -5px; -} - -.radio-inline, -.checkbox-inline { - position: relative; - display: inline-block; - padding-left: 20px; - margin-bottom: 0; - vertical-align: middle; - font-weight: normal; - cursor: pointer; -} - -.radio-inline + .radio-inline, -.checkbox-inline + .checkbox-inline { - margin-top: 0; - margin-left: 10px; -} - -input[type="radio"][disabled], input[type="radio"].disabled, fieldset[disabled] input[type="radio"], -input[type="checkbox"][disabled], -input[type="checkbox"].disabled, fieldset[disabled] -input[type="checkbox"] { - cursor: not-allowed; -} - -.radio-inline.disabled, fieldset[disabled] .radio-inline, -.checkbox-inline.disabled, fieldset[disabled] -.checkbox-inline { - cursor: not-allowed; -} - -.radio.disabled label, fieldset[disabled] .radio label, -.checkbox.disabled label, fieldset[disabled] -.checkbox label { - cursor: not-allowed; -} - -.form-control-static { - padding-top: 7px; - padding-bottom: 7px; - margin-bottom: 0; - min-height: 34px; -} -.form-control-static.input-lg, .input-group-lg > .form-control-static.form-control, -.input-group-lg > .form-control-static.input-group-addon, -.input-group-lg > .input-group-btn > .form-control-static.btn, .form-control-static.input-sm, .input-group-sm > .form-control-static.form-control, -.input-group-sm > .form-control-static.input-group-addon, -.input-group-sm > .input-group-btn > .form-control-static.btn { - padding-left: 0; - padding-right: 0; -} - -.input-sm, .input-group-sm > .form-control, -.input-group-sm > .input-group-addon, -.input-group-sm > .input-group-btn > .btn { - height: 30px; - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} - -select.input-sm, .input-group-sm > select.form-control, -.input-group-sm > select.input-group-addon, -.input-group-sm > .input-group-btn > select.btn { - height: 30px; - line-height: 30px; -} - -textarea.input-sm, .input-group-sm > textarea.form-control, -.input-group-sm > textarea.input-group-addon, -.input-group-sm > .input-group-btn > textarea.btn, -select[multiple].input-sm, -.input-group-sm > select[multiple].form-control, -.input-group-sm > select[multiple].input-group-addon, -.input-group-sm > .input-group-btn > select[multiple].btn { - height: auto; -} - -.form-group-sm .form-control { - height: 30px; - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -.form-group-sm select.form-control { - height: 30px; - line-height: 30px; -} -.form-group-sm textarea.form-control, -.form-group-sm select[multiple].form-control { - height: auto; -} -.form-group-sm .form-control-static { - height: 30px; - min-height: 32px; - padding: 6px 10px; - font-size: 12px; - line-height: 1.5; -} - -.input-lg, .input-group-lg > .form-control, -.input-group-lg > .input-group-addon, -.input-group-lg > .input-group-btn > .btn { - height: 46px; - padding: 10px 16px; - font-size: 18px; - line-height: 1.3333333; - border-radius: 6px; -} - -select.input-lg, .input-group-lg > select.form-control, -.input-group-lg > select.input-group-addon, -.input-group-lg > .input-group-btn > select.btn { - height: 46px; - line-height: 46px; -} - -textarea.input-lg, .input-group-lg > textarea.form-control, -.input-group-lg > textarea.input-group-addon, -.input-group-lg > .input-group-btn > textarea.btn, -select[multiple].input-lg, -.input-group-lg > select[multiple].form-control, -.input-group-lg > select[multiple].input-group-addon, -.input-group-lg > .input-group-btn > select[multiple].btn { - height: auto; -} - -.form-group-lg .form-control { - height: 46px; - padding: 10px 16px; - font-size: 18px; - line-height: 1.3333333; - border-radius: 6px; -} -.form-group-lg select.form-control { - height: 46px; - line-height: 46px; -} -.form-group-lg textarea.form-control, -.form-group-lg select[multiple].form-control { - height: auto; -} -.form-group-lg .form-control-static { - height: 46px; - min-height: 38px; - padding: 11px 16px; - font-size: 18px; - line-height: 1.3333333; -} - -.has-feedback { - position: relative; -} -.has-feedback .form-control { - padding-right: 42.5px; -} - -.form-control-feedback { - position: absolute; - top: 0; - right: 0; - z-index: 2; - display: block; - width: 34px; - height: 34px; - line-height: 34px; - text-align: center; - pointer-events: none; -} - -.input-lg + .form-control-feedback, .input-group-lg > .form-control + .form-control-feedback, -.input-group-lg > .input-group-addon + .form-control-feedback, -.input-group-lg > .input-group-btn > .btn + .form-control-feedback, -.input-group-lg + .form-control-feedback, -.form-group-lg .form-control + .form-control-feedback { - width: 46px; - height: 46px; - line-height: 46px; -} - -.input-sm + .form-control-feedback, .input-group-sm > .form-control + .form-control-feedback, -.input-group-sm > .input-group-addon + .form-control-feedback, -.input-group-sm > .input-group-btn > .btn + .form-control-feedback, -.input-group-sm + .form-control-feedback, -.form-group-sm .form-control + .form-control-feedback { - width: 30px; - height: 30px; - line-height: 30px; -} - -.has-success .help-block, -.has-success .control-label, -.has-success .radio, -.has-success .checkbox, -.has-success .radio-inline, -.has-success .checkbox-inline, .has-success.radio label, .has-success.checkbox label, .has-success.radio-inline label, .has-success.checkbox-inline label { - color: #3c763d; -} -.has-success .form-control { - border-color: #3c763d; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} -.has-success .form-control:focus { - border-color: #2b542c; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; -} -.has-success .input-group-addon { - color: #3c763d; - border-color: #3c763d; - background-color: #dff0d8; -} -.has-success .form-control-feedback { - color: #3c763d; -} - -.has-warning .help-block, -.has-warning .control-label, -.has-warning .radio, -.has-warning .checkbox, -.has-warning .radio-inline, -.has-warning .checkbox-inline, .has-warning.radio label, .has-warning.checkbox label, .has-warning.radio-inline label, .has-warning.checkbox-inline label { - color: #8a6d3b; -} -.has-warning .form-control { - border-color: #8a6d3b; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} -.has-warning .form-control:focus { - border-color: #66512c; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; -} -.has-warning .input-group-addon { - color: #8a6d3b; - border-color: #8a6d3b; - background-color: #fcf8e3; -} -.has-warning .form-control-feedback { - color: #8a6d3b; -} - -.has-error .help-block, -.has-error .control-label, -.has-error .radio, -.has-error .checkbox, -.has-error .radio-inline, -.has-error .checkbox-inline, .has-error.radio label, .has-error.checkbox label, .has-error.radio-inline label, .has-error.checkbox-inline label { - color: #a94442; -} -.has-error .form-control { - border-color: #a94442; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} -.has-error .form-control:focus { - border-color: #843534; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; -} -.has-error .input-group-addon { - color: #a94442; - border-color: #a94442; - background-color: #f2dede; -} -.has-error .form-control-feedback { - color: #a94442; -} - -.has-feedback label ~ .form-control-feedback { - top: 25px; -} -.has-feedback label.sr-only ~ .form-control-feedback { - top: 0; -} - -.help-block { - display: block; - margin-top: 5px; - margin-bottom: 10px; - color: white; -} - -@media (min-width: 768px) { - .form-inline .form-group { - display: inline-block; - margin-bottom: 0; - vertical-align: middle; - } - .form-inline .form-control { - display: inline-block; - width: auto; - vertical-align: middle; - } - .form-inline .form-control-static { - display: inline-block; - } - .form-inline .input-group { - display: inline-table; - vertical-align: middle; - } - .form-inline .input-group .input-group-addon, - .form-inline .input-group .input-group-btn, - .form-inline .input-group .form-control { - width: auto; - } - .form-inline .input-group > .form-control { - width: 100%; - } - .form-inline .control-label { - margin-bottom: 0; - vertical-align: middle; - } - .form-inline .radio, - .form-inline .checkbox { - display: inline-block; - margin-top: 0; - margin-bottom: 0; - vertical-align: middle; - } - .form-inline .radio label, - .form-inline .checkbox label { - padding-left: 0; - } - .form-inline .radio input[type="radio"], - .form-inline .checkbox input[type="checkbox"] { - position: relative; - margin-left: 0; - } - .form-inline .has-feedback .form-control-feedback { - top: 0; - } -} - -.form-horizontal .radio, -.form-horizontal .checkbox, -.form-horizontal .radio-inline, -.form-horizontal .checkbox-inline { - margin-top: 0; - margin-bottom: 0; - padding-top: 7px; -} -.form-horizontal .radio, -.form-horizontal .checkbox { - min-height: 27px; -} -.form-horizontal .form-group { - margin-left: -15px; - margin-right: -15px; -} -.form-horizontal .form-group:before, .form-horizontal .form-group:after { - content: " "; - display: table; -} -.form-horizontal .form-group:after { - clear: both; -} -@media (min-width: 768px) { - .form-horizontal .control-label { - text-align: right; - margin-bottom: 0; - padding-top: 7px; - } -} -.form-horizontal .has-feedback .form-control-feedback { - right: 15px; -} -@media (min-width: 768px) { - .form-horizontal .form-group-lg .control-label { - padding-top: 14.333333px; - font-size: 18px; - } -} -@media (min-width: 768px) { - .form-horizontal .form-group-sm .control-label { - padding-top: 6px; - font-size: 12px; - } -} - -.btn { - display: inline-block; - margin-bottom: 0; - font-weight: normal; - text-align: center; - vertical-align: middle; - touch-action: manipulation; - cursor: pointer; - background-image: none; - border: 1px solid transparent; - white-space: nowrap; - padding: 6px 12px; - font-size: 14px; - line-height: 1.42857143; - border-radius: 4px; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} -.btn:focus, .btn.focus, .btn:active:focus, .btn:active.focus, .btn.active:focus, .btn.active.focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -.btn:hover, .btn:focus, .btn.focus { - color: #333; - text-decoration: none; -} -.btn:active, .btn.active { - outline: 0; - background-image: none; - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); -} -.btn.disabled, .btn[disabled], fieldset[disabled] .btn { - cursor: not-allowed; - opacity: 0.65; - filter: alpha(opacity=65); - -webkit-box-shadow: none; - box-shadow: none; -} - -a.btn.disabled, fieldset[disabled] a.btn { - pointer-events: none; -} - -.btn-default { - color: #333; - background-color: #fff; - border-color: #ccc; -} -.btn-default:focus, .btn-default.focus { - color: #333; - background-color: #e6e6e6; - border-color: #8c8c8c; -} -.btn-default:hover { - color: #333; - background-color: #e6e6e6; - border-color: #adadad; -} -.btn-default:active, .btn-default.active, .open > .btn-default.dropdown-toggle { - color: #333; - background-color: #e6e6e6; - border-color: #adadad; -} -.btn-default:active:hover, .btn-default:active:focus, .btn-default:active.focus, .btn-default.active:hover, .btn-default.active:focus, .btn-default.active.focus, .open > .btn-default.dropdown-toggle:hover, .open > .btn-default.dropdown-toggle:focus, .open > .btn-default.dropdown-toggle.focus { - color: #333; - background-color: #d4d4d4; - border-color: #8c8c8c; -} -.btn-default:active, .btn-default.active, .open > .btn-default.dropdown-toggle { - background-image: none; -} -.btn-default.disabled, .btn-default.disabled:hover, .btn-default.disabled:focus, .btn-default.disabled.focus, .btn-default.disabled:active, .btn-default.disabled.active, .btn-default[disabled], .btn-default[disabled]:hover, .btn-default[disabled]:focus, .btn-default[disabled].focus, .btn-default[disabled]:active, .btn-default[disabled].active, fieldset[disabled] .btn-default, fieldset[disabled] .btn-default:hover, fieldset[disabled] .btn-default:focus, fieldset[disabled] .btn-default.focus, fieldset[disabled] .btn-default:active, fieldset[disabled] .btn-default.active { - background-color: #fff; - border-color: #ccc; -} -.btn-default .badge { - color: #fff; - background-color: #333; -} - -.btn-primary { - color: #fff; - background-color: #337ab7; - border-color: #2e6da4; -} -.btn-primary:focus, .btn-primary.focus { - color: #fff; - background-color: #286090; - border-color: #122b40; -} -.btn-primary:hover { - color: #fff; - background-color: #286090; - border-color: #204d74; -} -.btn-primary:active, .btn-primary.active, .open > .btn-primary.dropdown-toggle { - color: #fff; - background-color: #286090; - border-color: #204d74; -} -.btn-primary:active:hover, .btn-primary:active:focus, .btn-primary:active.focus, .btn-primary.active:hover, .btn-primary.active:focus, .btn-primary.active.focus, .open > .btn-primary.dropdown-toggle:hover, .open > .btn-primary.dropdown-toggle:focus, .open > .btn-primary.dropdown-toggle.focus { - color: #fff; - background-color: #204d74; - border-color: #122b40; -} -.btn-primary:active, .btn-primary.active, .open > .btn-primary.dropdown-toggle { - background-image: none; -} -.btn-primary.disabled, .btn-primary.disabled:hover, .btn-primary.disabled:focus, .btn-primary.disabled.focus, .btn-primary.disabled:active, .btn-primary.disabled.active, .btn-primary[disabled], .btn-primary[disabled]:hover, .btn-primary[disabled]:focus, .btn-primary[disabled].focus, .btn-primary[disabled]:active, .btn-primary[disabled].active, fieldset[disabled] .btn-primary, fieldset[disabled] .btn-primary:hover, fieldset[disabled] .btn-primary:focus, fieldset[disabled] .btn-primary.focus, fieldset[disabled] .btn-primary:active, fieldset[disabled] .btn-primary.active { - background-color: #337ab7; - border-color: #2e6da4; -} -.btn-primary .badge { - color: #337ab7; - background-color: #fff; -} - -.btn-success { - color: #fff; - background-color: #5cb85c; - border-color: #4cae4c; -} -.btn-success:focus, .btn-success.focus { - color: #fff; - background-color: #449d44; - border-color: #255625; -} -.btn-success:hover { - color: #fff; - background-color: #449d44; - border-color: #398439; -} -.btn-success:active, .btn-success.active, .open > .btn-success.dropdown-toggle { - color: #fff; - background-color: #449d44; - border-color: #398439; -} -.btn-success:active:hover, .btn-success:active:focus, .btn-success:active.focus, .btn-success.active:hover, .btn-success.active:focus, .btn-success.active.focus, .open > .btn-success.dropdown-toggle:hover, .open > .btn-success.dropdown-toggle:focus, .open > .btn-success.dropdown-toggle.focus { - color: #fff; - background-color: #398439; - border-color: #255625; -} -.btn-success:active, .btn-success.active, .open > .btn-success.dropdown-toggle { - background-image: none; -} -.btn-success.disabled, .btn-success.disabled:hover, .btn-success.disabled:focus, .btn-success.disabled.focus, .btn-success.disabled:active, .btn-success.disabled.active, .btn-success[disabled], .btn-success[disabled]:hover, .btn-success[disabled]:focus, .btn-success[disabled].focus, .btn-success[disabled]:active, .btn-success[disabled].active, fieldset[disabled] .btn-success, fieldset[disabled] .btn-success:hover, fieldset[disabled] .btn-success:focus, fieldset[disabled] .btn-success.focus, fieldset[disabled] .btn-success:active, fieldset[disabled] .btn-success.active { - background-color: #5cb85c; - border-color: #4cae4c; -} -.btn-success .badge { - color: #5cb85c; - background-color: #fff; -} - -.btn-info { - color: #fff; - background-color: #5bc0de; - border-color: #46b8da; -} -.btn-info:focus, .btn-info.focus { - color: #fff; - background-color: #31b0d5; - border-color: #1b6d85; -} -.btn-info:hover { - color: #fff; - background-color: #31b0d5; - border-color: #269abc; -} -.btn-info:active, .btn-info.active, .open > .btn-info.dropdown-toggle { - color: #fff; - background-color: #31b0d5; - border-color: #269abc; -} -.btn-info:active:hover, .btn-info:active:focus, .btn-info:active.focus, .btn-info.active:hover, .btn-info.active:focus, .btn-info.active.focus, .open > .btn-info.dropdown-toggle:hover, .open > .btn-info.dropdown-toggle:focus, .open > .btn-info.dropdown-toggle.focus { - color: #fff; - background-color: #269abc; - border-color: #1b6d85; -} -.btn-info:active, .btn-info.active, .open > .btn-info.dropdown-toggle { - background-image: none; -} -.btn-info.disabled, .btn-info.disabled:hover, .btn-info.disabled:focus, .btn-info.disabled.focus, .btn-info.disabled:active, .btn-info.disabled.active, .btn-info[disabled], .btn-info[disabled]:hover, .btn-info[disabled]:focus, .btn-info[disabled].focus, .btn-info[disabled]:active, .btn-info[disabled].active, fieldset[disabled] .btn-info, fieldset[disabled] .btn-info:hover, fieldset[disabled] .btn-info:focus, fieldset[disabled] .btn-info.focus, fieldset[disabled] .btn-info:active, fieldset[disabled] .btn-info.active { - background-color: #5bc0de; - border-color: #46b8da; -} -.btn-info .badge { - color: #5bc0de; - background-color: #fff; -} - -.btn-warning { - color: #fff; - background-color: #f0ad4e; - border-color: #eea236; -} -.btn-warning:focus, .btn-warning.focus { - color: #fff; - background-color: #ec971f; - border-color: #985f0d; -} -.btn-warning:hover { - color: #fff; - background-color: #ec971f; - border-color: #d58512; -} -.btn-warning:active, .btn-warning.active, .open > .btn-warning.dropdown-toggle { - color: #fff; - background-color: #ec971f; - border-color: #d58512; -} -.btn-warning:active:hover, .btn-warning:active:focus, .btn-warning:active.focus, .btn-warning.active:hover, .btn-warning.active:focus, .btn-warning.active.focus, .open > .btn-warning.dropdown-toggle:hover, .open > .btn-warning.dropdown-toggle:focus, .open > .btn-warning.dropdown-toggle.focus { - color: #fff; - background-color: #d58512; - border-color: #985f0d; -} -.btn-warning:active, .btn-warning.active, .open > .btn-warning.dropdown-toggle { - background-image: none; -} -.btn-warning.disabled, .btn-warning.disabled:hover, .btn-warning.disabled:focus, .btn-warning.disabled.focus, .btn-warning.disabled:active, .btn-warning.disabled.active, .btn-warning[disabled], .btn-warning[disabled]:hover, .btn-warning[disabled]:focus, .btn-warning[disabled].focus, .btn-warning[disabled]:active, .btn-warning[disabled].active, fieldset[disabled] .btn-warning, fieldset[disabled] .btn-warning:hover, fieldset[disabled] .btn-warning:focus, fieldset[disabled] .btn-warning.focus, fieldset[disabled] .btn-warning:active, fieldset[disabled] .btn-warning.active { - background-color: #f0ad4e; - border-color: #eea236; -} -.btn-warning .badge { - color: #f0ad4e; - background-color: #fff; -} - -.btn-danger { - color: #fff; - background-color: #d9534f; - border-color: #d43f3a; -} -.btn-danger:focus, .btn-danger.focus { - color: #fff; - background-color: #c9302c; - border-color: #761c19; -} -.btn-danger:hover { - color: #fff; - background-color: #c9302c; - border-color: #ac2925; -} -.btn-danger:active, .btn-danger.active, .open > .btn-danger.dropdown-toggle { - color: #fff; - background-color: #c9302c; - border-color: #ac2925; -} -.btn-danger:active:hover, .btn-danger:active:focus, .btn-danger:active.focus, .btn-danger.active:hover, .btn-danger.active:focus, .btn-danger.active.focus, .open > .btn-danger.dropdown-toggle:hover, .open > .btn-danger.dropdown-toggle:focus, .open > .btn-danger.dropdown-toggle.focus { - color: #fff; - background-color: #ac2925; - border-color: #761c19; -} -.btn-danger:active, .btn-danger.active, .open > .btn-danger.dropdown-toggle { - background-image: none; -} -.btn-danger.disabled, .btn-danger.disabled:hover, .btn-danger.disabled:focus, .btn-danger.disabled.focus, .btn-danger.disabled:active, .btn-danger.disabled.active, .btn-danger[disabled], .btn-danger[disabled]:hover, .btn-danger[disabled]:focus, .btn-danger[disabled].focus, .btn-danger[disabled]:active, .btn-danger[disabled].active, fieldset[disabled] .btn-danger, fieldset[disabled] .btn-danger:hover, fieldset[disabled] .btn-danger:focus, fieldset[disabled] .btn-danger.focus, fieldset[disabled] .btn-danger:active, fieldset[disabled] .btn-danger.active { - background-color: #d9534f; - border-color: #d43f3a; -} -.btn-danger .badge { - color: #d9534f; - background-color: #fff; -} - -.btn-link { - color: #08c; - font-weight: normal; - border-radius: 0; -} -.btn-link, .btn-link:active, .btn-link.active, .btn-link[disabled], fieldset[disabled] .btn-link { - background-color: transparent; - -webkit-box-shadow: none; - box-shadow: none; -} -.btn-link, .btn-link:hover, .btn-link:focus, .btn-link:active { - border-color: transparent; -} -.btn-link:hover, .btn-link:focus { - color: #1ab3ff; - text-decoration: underline; - background-color: transparent; -} -.btn-link[disabled]:hover, .btn-link[disabled]:focus, fieldset[disabled] .btn-link:hover, fieldset[disabled] .btn-link:focus { - color: #777777; - text-decoration: none; -} - -.btn-lg, .btn-group-lg > .btn { - padding: 10px 16px; - font-size: 18px; - line-height: 1.3333333; - border-radius: 6px; -} - -.btn-sm, .btn-group-sm > .btn { - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} - -.btn-xs, .btn-group-xs > .btn { - padding: 1px 5px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} - -.btn-block { - display: block; - width: 100%; -} - -.btn-block + .btn-block { - margin-top: 5px; -} - -input[type="submit"].btn-block, -input[type="reset"].btn-block, -input[type="button"].btn-block { - width: 100%; -} - -.fade { - opacity: 0; - -webkit-transition: opacity 0.15s linear; - -o-transition: opacity 0.15s linear; - transition: opacity 0.15s linear; -} -.fade.in { - opacity: 1; -} - -.collapse { - display: none; -} -.collapse.in { - display: block; -} - -tr.collapse.in { - display: table-row; -} - -tbody.collapse.in { - display: table-row-group; -} - -.collapsing { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition-property: height, visibility; - transition-property: height, visibility; - -webkit-transition-duration: 0.35s; - transition-duration: 0.35s; - -webkit-transition-timing-function: ease; - transition-timing-function: ease; -} - -.caret { - display: inline-block; - width: 0; - height: 0; - margin-left: 2px; - vertical-align: middle; - border-top: 4px dashed; - border-top: 4px solid \9; - border-right: 4px solid transparent; - border-left: 4px solid transparent; -} - -.dropup, -.dropdown { - position: relative; -} - -.dropdown-toggle:focus { - outline: 0; -} - -.dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: 1000; - display: none; - float: left; - min-width: 160px; - padding: 5px 0; - margin: 2px 0 0; - list-style: none; - font-size: 14px; - text-align: left; - background-color: #fff; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.15); - border-radius: 4px; - -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); - box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); - background-clip: padding-box; -} -.dropdown-menu.pull-right { - right: 0; - left: auto; -} -.dropdown-menu .divider { - height: 1px; - margin: 9px 0; - overflow: hidden; - background-color: #e5e5e5; -} -.dropdown-menu > li > a { - display: block; - padding: 3px 20px; - clear: both; - font-weight: normal; - line-height: 1.42857143; - color: #333333; - white-space: nowrap; -} - -.dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus { - text-decoration: none; - color: #262626; - background-color: #f5f5f5; -} - -.dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus { - color: #fff; - text-decoration: none; - outline: 0; - background-color: #337ab7; -} - -.dropdown-menu > .disabled > a, .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { - color: #777777; -} -.dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { - text-decoration: none; - background-color: transparent; - background-image: none; - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - cursor: not-allowed; -} - -.open > .dropdown-menu { - display: block; -} -.open > a { - outline: 0; -} - -.dropdown-menu-right { - left: auto; - right: 0; -} - -.dropdown-menu-left { - left: 0; - right: auto; -} - -.dropdown-header { - display: block; - padding: 3px 20px; - font-size: 12px; - line-height: 1.42857143; - color: #777777; - white-space: nowrap; -} - -.dropdown-backdrop { - position: fixed; - left: 0; - right: 0; - bottom: 0; - top: 0; - z-index: 990; -} - -.pull-right > .dropdown-menu { - right: 0; - left: auto; -} - -.dropup .caret, -.navbar-fixed-bottom .dropdown .caret { - border-top: 0; - border-bottom: 4px dashed; - border-bottom: 4px solid \9; - content: ""; -} -.dropup .dropdown-menu, -.navbar-fixed-bottom .dropdown .dropdown-menu { - top: auto; - bottom: 100%; - margin-bottom: 2px; -} - -@media (min-width: 768px) { - .navbar-right .dropdown-menu { - right: 0; - left: auto; - } - .navbar-right .dropdown-menu-left { - left: 0; - right: auto; - } -} -.btn-group, -.btn-group-vertical { - position: relative; - display: inline-block; - vertical-align: middle; -} -.btn-group > .btn, -.btn-group-vertical > .btn { - position: relative; - float: left; -} -.btn-group > .btn:hover, .btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active, -.btn-group-vertical > .btn:hover, -.btn-group-vertical > .btn:focus, -.btn-group-vertical > .btn:active, -.btn-group-vertical > .btn.active { - z-index: 2; -} - -.btn-group .btn + .btn, -.btn-group .btn + .btn-group, -.btn-group .btn-group + .btn, -.btn-group .btn-group + .btn-group { - margin-left: -1px; -} - -.btn-toolbar { - margin-left: -5px; -} -.btn-toolbar:before, .btn-toolbar:after { - content: " "; - display: table; -} -.btn-toolbar:after { - clear: both; -} -.btn-toolbar .btn, -.btn-toolbar .btn-group, -.btn-toolbar .input-group { - float: left; -} -.btn-toolbar > .btn, -.btn-toolbar > .btn-group, -.btn-toolbar > .input-group { - margin-left: 5px; -} - -.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { - border-radius: 0; -} - -.btn-group > .btn:first-child { - margin-left: 0; -} -.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { - border-bottom-right-radius: 0; - border-top-right-radius: 0; -} - -.btn-group > .btn:last-child:not(:first-child), -.btn-group > .dropdown-toggle:not(:first-child) { - border-bottom-left-radius: 0; - border-top-left-radius: 0; -} - -.btn-group > .btn-group { - float: left; -} - -.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { - border-radius: 0; -} - -.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, -.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { - border-bottom-right-radius: 0; - border-top-right-radius: 0; -} - -.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { - border-bottom-left-radius: 0; - border-top-left-radius: 0; -} - -.btn-group .dropdown-toggle:active, -.btn-group.open .dropdown-toggle { - outline: 0; -} - -.btn-group > .btn + .dropdown-toggle { - padding-left: 8px; - padding-right: 8px; -} - -.btn-group > .btn-lg + .dropdown-toggle, .btn-group-lg.btn-group > .btn + .dropdown-toggle { - padding-left: 12px; - padding-right: 12px; -} - -.btn-group.open .dropdown-toggle { - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); -} -.btn-group.open .dropdown-toggle.btn-link { - -webkit-box-shadow: none; - box-shadow: none; -} - -.btn .caret { - margin-left: 0; -} - -.btn-lg .caret, .btn-group-lg > .btn .caret { - border-width: 5px 5px 0; - border-bottom-width: 0; -} - -.dropup .btn-lg .caret, .dropup .btn-group-lg > .btn .caret { - border-width: 0 5px 5px; -} - -.btn-group-vertical > .btn, -.btn-group-vertical > .btn-group, -.btn-group-vertical > .btn-group > .btn { - display: block; - float: none; - width: 100%; - max-width: 100%; -} -.btn-group-vertical > .btn-group:before, .btn-group-vertical > .btn-group:after { - content: " "; - display: table; -} -.btn-group-vertical > .btn-group:after { - clear: both; -} -.btn-group-vertical > .btn-group > .btn { - float: none; -} -.btn-group-vertical > .btn + .btn, -.btn-group-vertical > .btn + .btn-group, -.btn-group-vertical > .btn-group + .btn, -.btn-group-vertical > .btn-group + .btn-group { - margin-top: -1px; - margin-left: 0; -} - -.btn-group-vertical > .btn:not(:first-child):not(:last-child) { - border-radius: 0; -} -.btn-group-vertical > .btn:first-child:not(:last-child) { - border-top-right-radius: 4px; - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.btn-group-vertical > .btn:last-child:not(:first-child) { - border-bottom-left-radius: 4px; - border-top-right-radius: 0; - border-top-left-radius: 0; -} - -.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { - border-radius: 0; -} - -.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, -.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} - -.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { - border-top-right-radius: 0; - border-top-left-radius: 0; -} - -.btn-group-justified { - display: table; - width: 100%; - table-layout: fixed; - border-collapse: separate; -} -.btn-group-justified > .btn, -.btn-group-justified > .btn-group { - float: none; - display: table-cell; - width: 1%; -} -.btn-group-justified > .btn-group .btn { - width: 100%; -} -.btn-group-justified > .btn-group .dropdown-menu { - left: auto; -} - -[data-toggle="buttons"] > .btn input[type="radio"], -[data-toggle="buttons"] > .btn input[type="checkbox"], -[data-toggle="buttons"] > .btn-group > .btn input[type="radio"], -[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { - position: absolute; - clip: rect(0, 0, 0, 0); - pointer-events: none; -} - -.input-group { - position: relative; - display: table; - border-collapse: separate; -} -.input-group[class*="col-"] { - float: none; - padding-left: 0; - padding-right: 0; -} -.input-group .form-control { - position: relative; - z-index: 2; - float: left; - width: 100%; - margin-bottom: 0; -} - -.input-group-addon, -.input-group-btn, -.input-group .form-control { - display: table-cell; -} -.input-group-addon:not(:first-child):not(:last-child), -.input-group-btn:not(:first-child):not(:last-child), -.input-group .form-control:not(:first-child):not(:last-child) { - border-radius: 0; -} - -.input-group-addon, -.input-group-btn { - width: 1%; - white-space: nowrap; - vertical-align: middle; -} - -.input-group-addon { - padding: 6px 12px; - font-size: 14px; - font-weight: normal; - line-height: 1; - color: #555555; - text-align: center; - background-color: #eeeeee; - border: 1px solid #ccc; - border-radius: 4px; -} -.input-group-addon.input-sm, -.input-group-sm > .input-group-addon, -.input-group-sm > .input-group-btn > .input-group-addon.btn { - padding: 5px 10px; - font-size: 12px; - border-radius: 3px; -} -.input-group-addon.input-lg, -.input-group-lg > .input-group-addon, -.input-group-lg > .input-group-btn > .input-group-addon.btn { - padding: 10px 16px; - font-size: 18px; - border-radius: 6px; -} -.input-group-addon input[type="radio"], -.input-group-addon input[type="checkbox"] { - margin-top: 0; -} - -.input-group .form-control:first-child, -.input-group-addon:first-child, -.input-group-btn:first-child > .btn, -.input-group-btn:first-child > .btn-group > .btn, -.input-group-btn:first-child > .dropdown-toggle, -.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), -.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { - border-bottom-right-radius: 0; - border-top-right-radius: 0; -} - -.input-group-addon:first-child { - border-right: 0; -} - -.input-group .form-control:last-child, -.input-group-addon:last-child, -.input-group-btn:last-child > .btn, -.input-group-btn:last-child > .btn-group > .btn, -.input-group-btn:last-child > .dropdown-toggle, -.input-group-btn:first-child > .btn:not(:first-child), -.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { - border-bottom-left-radius: 0; - border-top-left-radius: 0; -} - -.input-group-addon:last-child { - border-left: 0; -} - -.input-group-btn { - position: relative; - font-size: 0; - white-space: nowrap; -} -.input-group-btn > .btn { - position: relative; -} -.input-group-btn > .btn + .btn { - margin-left: -1px; -} -.input-group-btn > .btn:hover, .input-group-btn > .btn:focus, .input-group-btn > .btn:active { - z-index: 2; -} -.input-group-btn:first-child > .btn, -.input-group-btn:first-child > .btn-group { - margin-right: -1px; -} -.input-group-btn:last-child > .btn, -.input-group-btn:last-child > .btn-group { - z-index: 2; - margin-left: -1px; -} - -.nav { - margin-bottom: 0; - padding-left: 0; - list-style: none; -} -.nav:before, .nav:after { - content: " "; - display: table; -} -.nav:after { - clear: both; -} -.nav > li { - position: relative; - display: block; -} -.nav > li > a { - position: relative; - display: block; - padding: 10px 15px; -} -.nav > li > a:hover, .nav > li > a:focus { - text-decoration: none; - background-color: #eeeeee; -} -.nav > li.disabled > a { - color: #777777; -} -.nav > li.disabled > a:hover, .nav > li.disabled > a:focus { - color: #777777; - text-decoration: none; - background-color: transparent; - cursor: not-allowed; -} -.nav .open > a, .nav .open > a:hover, .nav .open > a:focus { - background-color: #eeeeee; - border-color: #08c; -} -.nav .nav-divider { - height: 1px; - margin: 9px 0; - overflow: hidden; - background-color: #e5e5e5; -} -.nav > li > a > img { - max-width: none; -} - -.nav-tabs { - border-bottom: 1px solid #ddd; -} -.nav-tabs > li { - float: left; - margin-bottom: -1px; -} -.nav-tabs > li > a { - margin-right: 2px; - line-height: 1.42857143; - border: 1px solid transparent; - border-radius: 4px 4px 0 0; -} -.nav-tabs > li > a:hover { - border-color: #eeeeee #eeeeee #ddd; -} -.nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus { - color: #555555; - background-color: #2f2f2f; - border: 1px solid #ddd; - border-bottom-color: transparent; - cursor: default; -} - -.nav-pills > li { - float: left; -} -.nav-pills > li > a { - border-radius: 4px; -} -.nav-pills > li + li { - margin-left: 2px; -} -.nav-pills > li.active > a, .nav-pills > li.active > a:hover, .nav-pills > li.active > a:focus { - color: #fff; - background-color: #337ab7; -} - -.nav-stacked > li { - float: none; -} -.nav-stacked > li + li { - margin-top: 2px; - margin-left: 0; -} - -.nav-justified, .nav-tabs.nav-justified { - width: 100%; -} -.nav-justified > li, .nav-tabs.nav-justified > li { - float: none; -} -.nav-justified > li > a, .nav-tabs.nav-justified > li > a { - text-align: center; - margin-bottom: 5px; -} -.nav-justified > .dropdown .dropdown-menu { - top: auto; - left: auto; -} -@media (min-width: 768px) { - .nav-justified > li, .nav-tabs.nav-justified > li { - display: table-cell; - width: 1%; - } - .nav-justified > li > a, .nav-tabs.nav-justified > li > a { - margin-bottom: 0; - } -} - -.nav-tabs-justified, .nav-tabs.nav-justified { - border-bottom: 0; -} -.nav-tabs-justified > li > a, .nav-tabs.nav-justified > li > a { - margin-right: 0; - border-radius: 4px; -} -.nav-tabs-justified > .active > a, .nav-tabs.nav-justified > .active > a, -.nav-tabs-justified > .active > a:hover, -.nav-tabs.nav-justified > .active > a:hover, -.nav-tabs-justified > .active > a:focus, -.nav-tabs.nav-justified > .active > a:focus { - border: 1px solid #ddd; -} -@media (min-width: 768px) { - .nav-tabs-justified > li > a, .nav-tabs.nav-justified > li > a { - border-bottom: 1px solid #ddd; - border-radius: 4px 4px 0 0; - } - .nav-tabs-justified > .active > a, .nav-tabs.nav-justified > .active > a, - .nav-tabs-justified > .active > a:hover, - .nav-tabs.nav-justified > .active > a:hover, - .nav-tabs-justified > .active > a:focus, - .nav-tabs.nav-justified > .active > a:focus { - border-bottom-color: #2f2f2f; - } -} - -.tab-content > .tab-pane { - display: none; -} -.tab-content > .active { - display: block; -} - -.nav-tabs .dropdown-menu { - margin-top: -1px; - border-top-right-radius: 0; - border-top-left-radius: 0; -} - -.navbar { - position: relative; - min-height: 50px; - margin-bottom: 20px; - border: 1px solid transparent; -} -.navbar:before, .navbar:after { - content: " "; - display: table; -} -.navbar:after { - clear: both; -} -@media (min-width: 768px) { - .navbar { - border-radius: 4px; - } -} - -.navbar-header:before, .navbar-header:after { - content: " "; - display: table; -} -.navbar-header:after { - clear: both; -} -@media (min-width: 768px) { - .navbar-header { - float: left; - } -} - -.navbar-collapse { - overflow-x: visible; - padding-right: 15px; - padding-left: 15px; - border-top: 1px solid transparent; - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); - -webkit-overflow-scrolling: touch; -} -.navbar-collapse:before, .navbar-collapse:after { - content: " "; - display: table; -} -.navbar-collapse:after { - clear: both; -} -.navbar-collapse.in { - overflow-y: auto; -} -@media (min-width: 768px) { - .navbar-collapse { - width: auto; - border-top: 0; - box-shadow: none; - } - .navbar-collapse.collapse { - display: block !important; - height: auto !important; - padding-bottom: 0; - overflow: visible !important; - } - .navbar-collapse.in { - overflow-y: visible; - } - .navbar-fixed-top .navbar-collapse, .navbar-static-top .navbar-collapse, .navbar-fixed-bottom .navbar-collapse { - padding-left: 0; - padding-right: 0; - } -} - -.navbar-fixed-top .navbar-collapse, -.navbar-fixed-bottom .navbar-collapse { - max-height: 340px; -} -@media (max-device-width: 480px) and (orientation: landscape) { - .navbar-fixed-top .navbar-collapse, - .navbar-fixed-bottom .navbar-collapse { - max-height: 200px; - } -} - -.container > .navbar-header, -.container > .navbar-collapse, -.container-fluid > .navbar-header, -.container-fluid > .navbar-collapse { - margin-right: -15px; - margin-left: -15px; -} -@media (min-width: 768px) { - .container > .navbar-header, - .container > .navbar-collapse, - .container-fluid > .navbar-header, - .container-fluid > .navbar-collapse { - margin-right: 0; - margin-left: 0; - } -} - -.navbar-static-top { - z-index: 1000; - border-width: 0 0 1px; -} -@media (min-width: 768px) { - .navbar-static-top { - border-radius: 0; - } -} - -.navbar-fixed-top, -.navbar-fixed-bottom { - position: fixed; - right: 0; - left: 0; - z-index: 1030; -} -@media (min-width: 768px) { - .navbar-fixed-top, - .navbar-fixed-bottom { - border-radius: 0; - } -} - -.navbar-fixed-top { - top: 0; - border-width: 0 0 1px; -} - -.navbar-fixed-bottom { - bottom: 0; - margin-bottom: 0; - border-width: 1px 0 0; -} - -.navbar-brand { - float: left; - padding: 15px 15px; - font-size: 18px; - line-height: 20px; - height: 50px; -} -.navbar-brand:hover, .navbar-brand:focus { - text-decoration: none; -} -.navbar-brand > img { - display: block; -} -@media (min-width: 768px) { - .navbar > .container .navbar-brand, .navbar > .container-fluid .navbar-brand { - margin-left: -15px; - } -} - -.navbar-toggle { - position: relative; - float: right; - margin-right: 15px; - padding: 9px 10px; - margin-top: 8px; - margin-bottom: 8px; - background-color: transparent; - background-image: none; - border: 1px solid transparent; - border-radius: 4px; -} -.navbar-toggle:focus { - outline: 0; -} -.navbar-toggle .icon-bar { - display: block; - width: 22px; - height: 2px; - border-radius: 1px; -} -.navbar-toggle .icon-bar + .icon-bar { - margin-top: 4px; -} -@media (min-width: 768px) { - .navbar-toggle { - display: none; - } -} - -.navbar-nav { - margin: 7.5px -15px; -} -.navbar-nav > li > a { - padding-top: 10px; - padding-bottom: 10px; - line-height: 20px; -} -@media (max-width: 767px) { - .navbar-nav .open .dropdown-menu { - position: static; - float: none; - width: auto; - margin-top: 0; - background-color: transparent; - border: 0; - box-shadow: none; - } - .navbar-nav .open .dropdown-menu > li > a, - .navbar-nav .open .dropdown-menu .dropdown-header { - padding: 5px 15px 5px 25px; - } - .navbar-nav .open .dropdown-menu > li > a { - line-height: 20px; - } - .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-nav .open .dropdown-menu > li > a:focus { - background-image: none; - } -} -@media (min-width: 768px) { - .navbar-nav { - float: left; - margin: 0; - } - .navbar-nav > li { - float: left; - } - .navbar-nav > li > a { - padding-top: 15px; - padding-bottom: 15px; - } -} - -.navbar-form { - margin-left: -15px; - margin-right: -15px; - padding: 10px 15px; - border-top: 1px solid transparent; - border-bottom: 1px solid transparent; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - margin-top: 8px; - margin-bottom: 8px; -} -@media (min-width: 768px) { - .navbar-form .form-group { - display: inline-block; - margin-bottom: 0; - vertical-align: middle; - } - .navbar-form .form-control { - display: inline-block; - width: auto; - vertical-align: middle; - } - .navbar-form .form-control-static { - display: inline-block; - } - .navbar-form .input-group { - display: inline-table; - vertical-align: middle; - } - .navbar-form .input-group .input-group-addon, - .navbar-form .input-group .input-group-btn, - .navbar-form .input-group .form-control { - width: auto; - } - .navbar-form .input-group > .form-control { - width: 100%; - } - .navbar-form .control-label { - margin-bottom: 0; - vertical-align: middle; - } - .navbar-form .radio, - .navbar-form .checkbox { - display: inline-block; - margin-top: 0; - margin-bottom: 0; - vertical-align: middle; - } - .navbar-form .radio label, - .navbar-form .checkbox label { - padding-left: 0; - } - .navbar-form .radio input[type="radio"], - .navbar-form .checkbox input[type="checkbox"] { - position: relative; - margin-left: 0; - } - .navbar-form .has-feedback .form-control-feedback { - top: 0; - } -} -@media (max-width: 767px) { - .navbar-form .form-group { - margin-bottom: 5px; - } - .navbar-form .form-group:last-child { - margin-bottom: 0; - } -} -@media (min-width: 768px) { - .navbar-form { - width: auto; - border: 0; - margin-left: 0; - margin-right: 0; - padding-top: 0; - padding-bottom: 0; - -webkit-box-shadow: none; - box-shadow: none; - } -} - -.navbar-nav > li > .dropdown-menu { - margin-top: 0; - border-top-right-radius: 0; - border-top-left-radius: 0; -} - -.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { - margin-bottom: 0; - border-top-right-radius: 4px; - border-top-left-radius: 4px; - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} - -.navbar-btn { - margin-top: 8px; - margin-bottom: 8px; -} -.navbar-btn.btn-sm, .btn-group-sm > .navbar-btn.btn { - margin-top: 10px; - margin-bottom: 10px; -} -.navbar-btn.btn-xs, .btn-group-xs > .navbar-btn.btn { - margin-top: 14px; - margin-bottom: 14px; -} - -.navbar-text { - margin-top: 15px; - margin-bottom: 15px; -} -@media (min-width: 768px) { - .navbar-text { - float: left; - margin-left: 15px; - margin-right: 15px; - } -} - -@media (min-width: 768px) { - .navbar-left { - float: left !important; - } - - .navbar-right { - float: right !important; - margin-right: -15px; - } - .navbar-right ~ .navbar-right { - margin-right: 0; - } -} -.navbar-default { - background-color: #f8f8f8; - border-color: #e7e7e7; -} -.navbar-default .navbar-brand { - color: #777; -} -.navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus { - color: #5e5e5e; - background-color: transparent; -} -.navbar-default .navbar-text { - color: #777; -} -.navbar-default .navbar-nav > li > a { - color: #777; -} -.navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus { - color: #333; - background-color: transparent; -} -.navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:focus { - color: #555; - background-color: #e7e7e7; -} -.navbar-default .navbar-nav > .disabled > a, .navbar-default .navbar-nav > .disabled > a:hover, .navbar-default .navbar-nav > .disabled > a:focus { - color: #ccc; - background-color: transparent; -} -.navbar-default .navbar-toggle { - border-color: #ddd; -} -.navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus { - background-color: #ddd; -} -.navbar-default .navbar-toggle .icon-bar { - background-color: #888; -} -.navbar-default .navbar-collapse, -.navbar-default .navbar-form { - border-color: #e7e7e7; -} -.navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus { - background-color: #e7e7e7; - color: #555; -} -@media (max-width: 767px) { - .navbar-default .navbar-nav .open .dropdown-menu > li > a { - color: #777; - } - .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { - color: #333; - background-color: transparent; - } - .navbar-default .navbar-nav .open .dropdown-menu > .active > a, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #555; - background-color: #e7e7e7; - } - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #ccc; - background-color: transparent; - } -} -.navbar-default .navbar-link { - color: #777; -} -.navbar-default .navbar-link:hover { - color: #333; -} -.navbar-default .btn-link { - color: #777; -} -.navbar-default .btn-link:hover, .navbar-default .btn-link:focus { - color: #333; -} -.navbar-default .btn-link[disabled]:hover, .navbar-default .btn-link[disabled]:focus, fieldset[disabled] .navbar-default .btn-link:hover, fieldset[disabled] .navbar-default .btn-link:focus { - color: #ccc; -} - -.navbar-inverse { - background-color: #222; - border-color: #090909; -} -.navbar-inverse .navbar-brand { - color: #9d9d9d; -} -.navbar-inverse .navbar-brand:hover, .navbar-inverse .navbar-brand:focus { - color: #fff; - background-color: transparent; -} -.navbar-inverse .navbar-text { - color: #9d9d9d; -} -.navbar-inverse .navbar-nav > li > a { - color: #9d9d9d; -} -.navbar-inverse .navbar-nav > li > a:hover, .navbar-inverse .navbar-nav > li > a:focus { - color: #fff; - background-color: transparent; -} -.navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus { - color: #fff; - background-color: #090909; -} -.navbar-inverse .navbar-nav > .disabled > a, .navbar-inverse .navbar-nav > .disabled > a:hover, .navbar-inverse .navbar-nav > .disabled > a:focus { - color: #444; - background-color: transparent; -} -.navbar-inverse .navbar-toggle { - border-color: #333; -} -.navbar-inverse .navbar-toggle:hover, .navbar-inverse .navbar-toggle:focus { - background-color: #333; -} -.navbar-inverse .navbar-toggle .icon-bar { - background-color: #fff; -} -.navbar-inverse .navbar-collapse, -.navbar-inverse .navbar-form { - border-color: #101010; -} -.navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus { - background-color: #090909; - color: #fff; -} -@media (max-width: 767px) { - .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { - border-color: #090909; - } - .navbar-inverse .navbar-nav .open .dropdown-menu .divider { - background-color: #090909; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { - color: #9d9d9d; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { - color: #fff; - background-color: transparent; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #fff; - background-color: #090909; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #444; - background-color: transparent; - } -} -.navbar-inverse .navbar-link { - color: #9d9d9d; -} -.navbar-inverse .navbar-link:hover { - color: #fff; -} -.navbar-inverse .btn-link { - color: #9d9d9d; -} -.navbar-inverse .btn-link:hover, .navbar-inverse .btn-link:focus { - color: #fff; -} -.navbar-inverse .btn-link[disabled]:hover, .navbar-inverse .btn-link[disabled]:focus, fieldset[disabled] .navbar-inverse .btn-link:hover, fieldset[disabled] .navbar-inverse .btn-link:focus { - color: #444; -} - -.breadcrumb { - padding: 8px 15px; - margin-bottom: 20px; - list-style: none; - background-color: #f5f5f5; - border-radius: 4px; -} -.breadcrumb > li { - display: inline-block; -} -.breadcrumb > li + li:before { - content: "/ "; - padding: 0 5px; - color: #ccc; -} -.breadcrumb > .active { - color: #777777; -} - -.pagination { - display: inline-block; - padding-left: 0; - margin: 20px 0; - border-radius: 4px; -} -.pagination > li { - display: inline; -} -.pagination > li > a, -.pagination > li > span { - position: relative; - float: left; - padding: 6px 12px; - line-height: 1.42857143; - text-decoration: none; - color: #08c; - background-color: #fff; - border: 1px solid #ddd; - margin-left: -1px; -} -.pagination > li:first-child > a, -.pagination > li:first-child > span { - margin-left: 0; - border-bottom-left-radius: 4px; - border-top-left-radius: 4px; -} -.pagination > li:last-child > a, -.pagination > li:last-child > span { - border-bottom-right-radius: 4px; - border-top-right-radius: 4px; -} -.pagination > li > a:hover, .pagination > li > a:focus, -.pagination > li > span:hover, -.pagination > li > span:focus { - z-index: 3; - color: #1ab3ff; - background-color: #eeeeee; - border-color: #ddd; -} -.pagination > .active > a, .pagination > .active > a:hover, .pagination > .active > a:focus, -.pagination > .active > span, -.pagination > .active > span:hover, -.pagination > .active > span:focus { - z-index: 2; - color: #fff; - background-color: #337ab7; - border-color: #337ab7; - cursor: default; -} -.pagination > .disabled > span, -.pagination > .disabled > span:hover, -.pagination > .disabled > span:focus, -.pagination > .disabled > a, -.pagination > .disabled > a:hover, -.pagination > .disabled > a:focus { - color: #777777; - background-color: #fff; - border-color: #ddd; - cursor: not-allowed; -} - -.pagination-lg > li > a, -.pagination-lg > li > span { - padding: 10px 16px; - font-size: 18px; - line-height: 1.3333333; -} -.pagination-lg > li:first-child > a, -.pagination-lg > li:first-child > span { - border-bottom-left-radius: 6px; - border-top-left-radius: 6px; -} -.pagination-lg > li:last-child > a, -.pagination-lg > li:last-child > span { - border-bottom-right-radius: 6px; - border-top-right-radius: 6px; -} - -.pagination-sm > li > a, -.pagination-sm > li > span { - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; -} -.pagination-sm > li:first-child > a, -.pagination-sm > li:first-child > span { - border-bottom-left-radius: 3px; - border-top-left-radius: 3px; -} -.pagination-sm > li:last-child > a, -.pagination-sm > li:last-child > span { - border-bottom-right-radius: 3px; - border-top-right-radius: 3px; -} - -.pager { - padding-left: 0; - margin: 20px 0; - list-style: none; - text-align: center; -} -.pager:before, .pager:after { - content: " "; - display: table; -} -.pager:after { - clear: both; -} -.pager li { - display: inline; -} -.pager li > a, -.pager li > span { - display: inline-block; - padding: 5px 14px; - background-color: #fff; - border: 1px solid #ddd; - border-radius: 15px; -} -.pager li > a:hover, -.pager li > a:focus { - text-decoration: none; - background-color: #eeeeee; -} -.pager .next > a, -.pager .next > span { - float: right; -} -.pager .previous > a, -.pager .previous > span { - float: left; -} -.pager .disabled > a, -.pager .disabled > a:hover, -.pager .disabled > a:focus, -.pager .disabled > span { - color: #777777; - background-color: #fff; - cursor: not-allowed; -} - -.label { - display: inline; - padding: .2em .6em .3em; - font-size: 75%; - font-weight: bold; - line-height: 1; - color: #fff; - text-align: center; - white-space: nowrap; - vertical-align: baseline; - border-radius: .25em; -} -.label:empty { - display: none; -} -.btn .label { - position: relative; - top: -1px; -} - -a.label:hover, a.label:focus { - color: #fff; - text-decoration: none; - cursor: pointer; -} - -.label-default { - background-color: #777777; -} -.label-default[href]:hover, .label-default[href]:focus { - background-color: #5e5e5e; -} - -.label-primary { - background-color: #337ab7; -} -.label-primary[href]:hover, .label-primary[href]:focus { - background-color: #286090; -} - -.label-success { - background-color: #5cb85c; -} -.label-success[href]:hover, .label-success[href]:focus { - background-color: #449d44; -} - -.label-info { - background-color: #5bc0de; -} -.label-info[href]:hover, .label-info[href]:focus { - background-color: #31b0d5; -} - -.label-warning { - background-color: #f0ad4e; -} -.label-warning[href]:hover, .label-warning[href]:focus { - background-color: #ec971f; -} - -.label-danger { - background-color: #d9534f; -} -.label-danger[href]:hover, .label-danger[href]:focus { - background-color: #c9302c; -} - -.badge { - display: inline-block; - min-width: 10px; - padding: 3px 7px; - font-size: 12px; - font-weight: bold; - color: #fff; - line-height: 1; - vertical-align: middle; - white-space: nowrap; - text-align: center; - background-color: #777777; - border-radius: 10px; -} -.badge:empty { - display: none; -} -.btn .badge { - position: relative; - top: -1px; -} -.btn-xs .badge, .btn-group-xs > .btn .badge, .btn-group-xs > .btn .badge { - top: 0; - padding: 1px 5px; -} -.list-group-item.active > .badge, .nav-pills > .active > a > .badge { - color: #08c; - background-color: #fff; -} -.list-group-item > .badge { - float: right; -} -.list-group-item > .badge + .badge { - margin-right: 5px; -} -.nav-pills > li > a > .badge { - margin-left: 3px; -} - -a.badge:hover, a.badge:focus { - color: #fff; - text-decoration: none; - cursor: pointer; -} - -.jumbotron { - padding-top: 30px; - padding-bottom: 30px; - margin-bottom: 30px; - color: inherit; - background-color: #eeeeee; -} -.jumbotron h1, -.jumbotron .h1 { - color: inherit; -} -.jumbotron p { - margin-bottom: 15px; - font-size: 21px; - font-weight: 200; -} -.jumbotron > hr { - border-top-color: #d5d5d5; -} -.container .jumbotron, .container-fluid .jumbotron { - border-radius: 6px; -} -.jumbotron .container { - max-width: 100%; -} -@media screen and (min-width: 768px) { - .jumbotron { - padding-top: 48px; - padding-bottom: 48px; - } - .container .jumbotron, .container-fluid .jumbotron { - padding-left: 60px; - padding-right: 60px; - } - .jumbotron h1, - .jumbotron .h1 { - font-size: 63px; - } -} - -.thumbnail { - display: block; - padding: 4px; - margin-bottom: 20px; - line-height: 1.42857143; - background-color: #2f2f2f; - border: 1px solid #ddd; - border-radius: 4px; - -webkit-transition: border 0.2s ease-in-out; - -o-transition: border 0.2s ease-in-out; - transition: border 0.2s ease-in-out; -} -.thumbnail > img, -.thumbnail a > img { - display: block; - max-width: 100%; - height: auto; - margin-left: auto; - margin-right: auto; -} -.thumbnail .caption { - padding: 9px; - color: #c6c6c6; -} - -a.thumbnail:hover, -a.thumbnail:focus, -a.thumbnail.active { - border-color: #08c; -} - -.alert { - padding: 15px; - margin-bottom: 20px; - border: 1px solid transparent; - border-radius: 4px; -} -.alert h4 { - margin-top: 0; - color: inherit; -} -.alert .alert-link { - font-weight: bold; -} -.alert > p, -.alert > ul { - margin-bottom: 0; -} -.alert > p + p { - margin-top: 5px; -} - -.alert-dismissable, -.alert-dismissible { - padding-right: 35px; -} -.alert-dismissable .close, -.alert-dismissible .close { - position: relative; - top: -2px; - right: -21px; - color: inherit; -} - -.alert-success { - background-color: #dff0d8; - border-color: #d6e9c6; - color: #3c763d; -} -.alert-success hr { - border-top-color: #c9e2b3; -} -.alert-success .alert-link { - color: #2b542c; -} - -.alert-info { - background-color: #d9edf7; - border-color: #bce8f1; - color: #31708f; -} -.alert-info hr { - border-top-color: #a6e1ec; -} -.alert-info .alert-link { - color: #245269; -} - -.alert-warning { - background-color: #fcf8e3; - border-color: #faebcc; - color: #8a6d3b; -} -.alert-warning hr { - border-top-color: #f7e1b5; -} -.alert-warning .alert-link { - color: #66512c; -} - -.alert-danger { - background-color: #f2dede; - border-color: #ebccd1; - color: #a94442; -} -.alert-danger hr { - border-top-color: #e4b9c0; -} -.alert-danger .alert-link { - color: #843534; -} - -@-webkit-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -@keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -.progress { - overflow: hidden; - height: 20px; - margin-bottom: 20px; - background-color: #f5f5f5; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); -} - -.progress-bar { - float: left; - width: 0%; - height: 100%; - font-size: 12px; - line-height: 20px; - color: #fff; - text-align: center; - background-color: #337ab7; - -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -webkit-transition: width 0.6s ease; - -o-transition: width 0.6s ease; - transition: width 0.6s ease; -} - -.progress-striped .progress-bar, -.progress-bar-striped { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, rgba(0, 0, 0, 0) 25%, rgba(0, 0, 0, 0) 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, rgba(0, 0, 0, 0) 75%, rgba(0, 0, 0, 0)); - background-size: 40px 40px; -} - -.progress.active .progress-bar, -.progress-bar.active { - -webkit-animation: progress-bar-stripes 2s linear infinite; - -o-animation: progress-bar-stripes 2s linear infinite; - animation: progress-bar-stripes 2s linear infinite; -} - -.progress-bar-success { - background-color: #5cb85c; -} -.progress-striped .progress-bar-success { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, rgba(0, 0, 0, 0) 25%, rgba(0, 0, 0, 0) 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, rgba(0, 0, 0, 0) 75%, rgba(0, 0, 0, 0)); -} - -.progress-bar-info { - background-color: #5bc0de; -} -.progress-striped .progress-bar-info { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, rgba(0, 0, 0, 0) 25%, rgba(0, 0, 0, 0) 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, rgba(0, 0, 0, 0) 75%, rgba(0, 0, 0, 0)); -} - -.progress-bar-warning { - background-color: #f0ad4e; -} -.progress-striped .progress-bar-warning { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, rgba(0, 0, 0, 0) 25%, rgba(0, 0, 0, 0) 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, rgba(0, 0, 0, 0) 75%, rgba(0, 0, 0, 0)); -} - -.progress-bar-danger { - background-color: #d9534f; -} -.progress-striped .progress-bar-danger { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, rgba(0, 0, 0, 0) 25%, rgba(0, 0, 0, 0) 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, rgba(0, 0, 0, 0) 75%, rgba(0, 0, 0, 0)); -} - -.media { - margin-top: 15px; -} -.media:first-child { - margin-top: 0; -} - -.media, -.media-body { - zoom: 1; - overflow: hidden; -} - -.media-body { - width: 10000px; -} - -.media-object { - display: block; -} -.media-object.img-thumbnail { - max-width: none; -} - -.media-right, -.media > .pull-right { - padding-left: 10px; -} - -.media-left, -.media > .pull-left { - padding-right: 10px; -} - -.media-left, -.media-right, -.media-body { - display: table-cell; - vertical-align: top; -} - -.media-middle { - vertical-align: middle; -} - -.media-bottom { - vertical-align: bottom; -} - -.media-heading { - margin-top: 0; - margin-bottom: 5px; -} - -.media-list { - padding-left: 0; - list-style: none; -} - -.list-group { - margin-bottom: 20px; - padding-left: 0; -} - -.list-group-item { - position: relative; - display: block; - padding: 10px 15px; - margin-bottom: -1px; - background-color: #fff; - border: 1px solid #ddd; -} -.list-group-item:first-child { - border-top-right-radius: 4px; - border-top-left-radius: 4px; -} -.list-group-item:last-child { - margin-bottom: 0; - border-bottom-right-radius: 4px; - border-bottom-left-radius: 4px; -} - -a.list-group-item, -button.list-group-item { - color: #555; -} -a.list-group-item .list-group-item-heading, -button.list-group-item .list-group-item-heading { - color: #333; -} -a.list-group-item:hover, a.list-group-item:focus, -button.list-group-item:hover, -button.list-group-item:focus { - text-decoration: none; - color: #555; - background-color: #f5f5f5; -} - -button.list-group-item { - width: 100%; - text-align: left; -} - -.list-group-item.disabled, .list-group-item.disabled:hover, .list-group-item.disabled:focus { - background-color: #eeeeee; - color: #777777; - cursor: not-allowed; -} -.list-group-item.disabled .list-group-item-heading, .list-group-item.disabled:hover .list-group-item-heading, .list-group-item.disabled:focus .list-group-item-heading { - color: inherit; -} -.list-group-item.disabled .list-group-item-text, .list-group-item.disabled:hover .list-group-item-text, .list-group-item.disabled:focus .list-group-item-text { - color: #777777; -} -.list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus { - z-index: 2; - color: #fff; - background-color: #337ab7; - border-color: #337ab7; -} -.list-group-item.active .list-group-item-heading, -.list-group-item.active .list-group-item-heading > small, -.list-group-item.active .list-group-item-heading > .small, .list-group-item.active:hover .list-group-item-heading, -.list-group-item.active:hover .list-group-item-heading > small, -.list-group-item.active:hover .list-group-item-heading > .small, .list-group-item.active:focus .list-group-item-heading, -.list-group-item.active:focus .list-group-item-heading > small, -.list-group-item.active:focus .list-group-item-heading > .small { - color: inherit; -} -.list-group-item.active .list-group-item-text, .list-group-item.active:hover .list-group-item-text, .list-group-item.active:focus .list-group-item-text { - color: #c7ddef; -} - -.list-group-item-success { - color: #3c763d; - background-color: #dff0d8; -} - -a.list-group-item-success, -button.list-group-item-success { - color: #3c763d; -} -a.list-group-item-success .list-group-item-heading, -button.list-group-item-success .list-group-item-heading { - color: inherit; -} -a.list-group-item-success:hover, a.list-group-item-success:focus, -button.list-group-item-success:hover, -button.list-group-item-success:focus { - color: #3c763d; - background-color: #d0e9c6; -} -a.list-group-item-success.active, a.list-group-item-success.active:hover, a.list-group-item-success.active:focus, -button.list-group-item-success.active, -button.list-group-item-success.active:hover, -button.list-group-item-success.active:focus { - color: #fff; - background-color: #3c763d; - border-color: #3c763d; -} - -.list-group-item-info { - color: #31708f; - background-color: #d9edf7; -} - -a.list-group-item-info, -button.list-group-item-info { - color: #31708f; -} -a.list-group-item-info .list-group-item-heading, -button.list-group-item-info .list-group-item-heading { - color: inherit; -} -a.list-group-item-info:hover, a.list-group-item-info:focus, -button.list-group-item-info:hover, -button.list-group-item-info:focus { - color: #31708f; - background-color: #c4e3f3; -} -a.list-group-item-info.active, a.list-group-item-info.active:hover, a.list-group-item-info.active:focus, -button.list-group-item-info.active, -button.list-group-item-info.active:hover, -button.list-group-item-info.active:focus { - color: #fff; - background-color: #31708f; - border-color: #31708f; -} - -.list-group-item-warning { - color: #8a6d3b; - background-color: #fcf8e3; -} - -a.list-group-item-warning, -button.list-group-item-warning { - color: #8a6d3b; -} -a.list-group-item-warning .list-group-item-heading, -button.list-group-item-warning .list-group-item-heading { - color: inherit; -} -a.list-group-item-warning:hover, a.list-group-item-warning:focus, -button.list-group-item-warning:hover, -button.list-group-item-warning:focus { - color: #8a6d3b; - background-color: #faf2cc; -} -a.list-group-item-warning.active, a.list-group-item-warning.active:hover, a.list-group-item-warning.active:focus, -button.list-group-item-warning.active, -button.list-group-item-warning.active:hover, -button.list-group-item-warning.active:focus { - color: #fff; - background-color: #8a6d3b; - border-color: #8a6d3b; -} - -.list-group-item-danger { - color: #a94442; - background-color: #f2dede; -} - -a.list-group-item-danger, -button.list-group-item-danger { - color: #a94442; -} -a.list-group-item-danger .list-group-item-heading, -button.list-group-item-danger .list-group-item-heading { - color: inherit; -} -a.list-group-item-danger:hover, a.list-group-item-danger:focus, -button.list-group-item-danger:hover, -button.list-group-item-danger:focus { - color: #a94442; - background-color: #ebcccc; -} -a.list-group-item-danger.active, a.list-group-item-danger.active:hover, a.list-group-item-danger.active:focus, -button.list-group-item-danger.active, -button.list-group-item-danger.active:hover, -button.list-group-item-danger.active:focus { - color: #fff; - background-color: #a94442; - border-color: #a94442; -} - -.list-group-item-heading { - margin-top: 0; - margin-bottom: 5px; -} - -.list-group-item-text { - margin-bottom: 0; - line-height: 1.3; -} - -.panel { - margin-bottom: 20px; - background-color: #fff; - border: 1px solid transparent; - border-radius: 4px; - -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); - box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); -} - -.panel-body { - padding: 15px; -} -.panel-body:before, .panel-body:after { - content: " "; - display: table; -} -.panel-body:after { - clear: both; -} - -.panel-heading { - padding: 10px 15px; - border-bottom: 1px solid transparent; - border-top-right-radius: 3px; - border-top-left-radius: 3px; -} -.panel-heading > .dropdown .dropdown-toggle { - color: inherit; -} - -.panel-title { - margin-top: 0; - margin-bottom: 0; - font-size: 16px; - color: inherit; -} -.panel-title > a, -.panel-title > small, -.panel-title > .small, -.panel-title > small > a, -.panel-title > .small > a { - color: inherit; -} - -.panel-footer { - padding: 10px 15px; - background-color: #f5f5f5; - border-top: 1px solid #ddd; - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; -} - -.panel > .list-group, -.panel > .panel-collapse > .list-group { - margin-bottom: 0; -} -.panel > .list-group .list-group-item, -.panel > .panel-collapse > .list-group .list-group-item { - border-width: 1px 0; - border-radius: 0; -} -.panel > .list-group:first-child .list-group-item:first-child, -.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { - border-top: 0; - border-top-right-radius: 3px; - border-top-left-radius: 3px; -} -.panel > .list-group:last-child .list-group-item:last-child, -.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { - border-bottom: 0; - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; -} -.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child { - border-top-right-radius: 0; - border-top-left-radius: 0; -} - -.panel-heading + .list-group .list-group-item:first-child { - border-top-width: 0; -} - -.list-group + .panel-footer { - border-top-width: 0; -} - -.panel > .table, -.panel > .table-responsive > .table, -.panel > .panel-collapse > .table { - margin-bottom: 0; -} -.panel > .table caption, -.panel > .table-responsive > .table caption, -.panel > .panel-collapse > .table caption { - padding-left: 15px; - padding-right: 15px; -} -.panel > .table:first-child, -.panel > .table-responsive:first-child > .table:first-child { - border-top-right-radius: 3px; - border-top-left-radius: 3px; -} -.panel > .table:first-child > thead:first-child > tr:first-child, -.panel > .table:first-child > tbody:first-child > tr:first-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { - border-top-left-radius: 3px; - border-top-right-radius: 3px; -} -.panel > .table:first-child > thead:first-child > tr:first-child td:first-child, -.panel > .table:first-child > thead:first-child > tr:first-child th:first-child, -.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, -.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { - border-top-left-radius: 3px; -} -.panel > .table:first-child > thead:first-child > tr:first-child td:last-child, -.panel > .table:first-child > thead:first-child > tr:first-child th:last-child, -.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, -.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { - border-top-right-radius: 3px; -} -.panel > .table:last-child, -.panel > .table-responsive:last-child > .table:last-child { - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; -} -.panel > .table:last-child > tbody:last-child > tr:last-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { - border-bottom-left-radius: 3px; - border-bottom-right-radius: 3px; -} -.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, -.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { - border-bottom-left-radius: 3px; -} -.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, -.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { - border-bottom-right-radius: 3px; -} -.panel > .panel-body + .table, -.panel > .panel-body + .table-responsive, -.panel > .table + .panel-body, -.panel > .table-responsive + .panel-body { - border-top: 1px solid #ddd; -} -.panel > .table > tbody:first-child > tr:first-child th, -.panel > .table > tbody:first-child > tr:first-child td { - border-top: 0; -} -.panel > .table-bordered, -.panel > .table-responsive > .table-bordered { - border: 0; -} -.panel > .table-bordered > thead > tr > th:first-child, -.panel > .table-bordered > thead > tr > td:first-child, -.panel > .table-bordered > tbody > tr > th:first-child, -.panel > .table-bordered > tbody > tr > td:first-child, -.panel > .table-bordered > tfoot > tr > th:first-child, -.panel > .table-bordered > tfoot > tr > td:first-child, -.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, -.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, -.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, -.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { - border-left: 0; -} -.panel > .table-bordered > thead > tr > th:last-child, -.panel > .table-bordered > thead > tr > td:last-child, -.panel > .table-bordered > tbody > tr > th:last-child, -.panel > .table-bordered > tbody > tr > td:last-child, -.panel > .table-bordered > tfoot > tr > th:last-child, -.panel > .table-bordered > tfoot > tr > td:last-child, -.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, -.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, -.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, -.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { - border-right: 0; -} -.panel > .table-bordered > thead > tr:first-child > td, -.panel > .table-bordered > thead > tr:first-child > th, -.panel > .table-bordered > tbody > tr:first-child > td, -.panel > .table-bordered > tbody > tr:first-child > th, -.panel > .table-responsive > .table-bordered > thead > tr:first-child > td, -.panel > .table-responsive > .table-bordered > thead > tr:first-child > th, -.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, -.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { - border-bottom: 0; -} -.panel > .table-bordered > tbody > tr:last-child > td, -.panel > .table-bordered > tbody > tr:last-child > th, -.panel > .table-bordered > tfoot > tr:last-child > td, -.panel > .table-bordered > tfoot > tr:last-child > th, -.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, -.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, -.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, -.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { - border-bottom: 0; -} -.panel > .table-responsive { - border: 0; - margin-bottom: 0; -} - -.panel-group { - margin-bottom: 20px; -} -.panel-group .panel { - margin-bottom: 0; - border-radius: 4px; -} -.panel-group .panel + .panel { - margin-top: 5px; -} -.panel-group .panel-heading { - border-bottom: 0; -} -.panel-group .panel-heading + .panel-collapse > .panel-body, -.panel-group .panel-heading + .panel-collapse > .list-group { - border-top: 1px solid #ddd; -} -.panel-group .panel-footer { - border-top: 0; -} -.panel-group .panel-footer + .panel-collapse .panel-body { - border-bottom: 1px solid #ddd; -} - -.panel-default { - border-color: #ddd; -} -.panel-default > .panel-heading { - color: #333333; - background-color: #f5f5f5; - border-color: #ddd; -} -.panel-default > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #ddd; -} -.panel-default > .panel-heading .badge { - color: #f5f5f5; - background-color: #333333; -} -.panel-default > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #ddd; -} - -.panel-primary { - border-color: #337ab7; -} -.panel-primary > .panel-heading { - color: #fff; - background-color: #337ab7; - border-color: #337ab7; -} -.panel-primary > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #337ab7; -} -.panel-primary > .panel-heading .badge { - color: #337ab7; - background-color: #fff; -} -.panel-primary > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #337ab7; -} - -.panel-success { - border-color: #d6e9c6; -} -.panel-success > .panel-heading { - color: #3c763d; - background-color: #dff0d8; - border-color: #d6e9c6; -} -.panel-success > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #d6e9c6; -} -.panel-success > .panel-heading .badge { - color: #dff0d8; - background-color: #3c763d; -} -.panel-success > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #d6e9c6; -} - -.panel-info { - border-color: #bce8f1; -} -.panel-info > .panel-heading { - color: #31708f; - background-color: #d9edf7; - border-color: #bce8f1; -} -.panel-info > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #bce8f1; -} -.panel-info > .panel-heading .badge { - color: #d9edf7; - background-color: #31708f; -} -.panel-info > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #bce8f1; -} - -.panel-warning { - border-color: #faebcc; -} -.panel-warning > .panel-heading { - color: #8a6d3b; - background-color: #fcf8e3; - border-color: #faebcc; -} -.panel-warning > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #faebcc; -} -.panel-warning > .panel-heading .badge { - color: #fcf8e3; - background-color: #8a6d3b; -} -.panel-warning > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #faebcc; -} - -.panel-danger { - border-color: #ebccd1; -} -.panel-danger > .panel-heading { - color: #a94442; - background-color: #f2dede; - border-color: #ebccd1; -} -.panel-danger > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #ebccd1; -} -.panel-danger > .panel-heading .badge { - color: #f2dede; - background-color: #a94442; -} -.panel-danger > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #ebccd1; -} - -.embed-responsive { - position: relative; - display: block; - height: 0; - padding: 0; - overflow: hidden; -} -.embed-responsive .embed-responsive-item, -.embed-responsive iframe, -.embed-responsive embed, -.embed-responsive object, -.embed-responsive video { - position: absolute; - top: 0; - left: 0; - bottom: 0; - height: 100%; - width: 100%; - border: 0; -} - -.embed-responsive-16by9 { - padding-bottom: 56.25%; -} - -.embed-responsive-4by3 { - padding-bottom: 75%; -} - -.well { - min-height: 20px; - padding: 19px; - margin-bottom: 20px; - background-color: #f5f5f5; - border: 1px solid #e3e3e3; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); -} -.well blockquote { - border-color: #ddd; - border-color: rgba(0, 0, 0, 0.15); -} - -.well-lg { - padding: 24px; - border-radius: 6px; -} - -.well-sm { - padding: 9px; - border-radius: 3px; -} - -.close { - float: right; - font-size: 21px; - font-weight: bold; - line-height: 1; - color: #000; - text-shadow: 0 1px 0 #fff; - opacity: 0.2; - filter: alpha(opacity=20); -} -.close:hover, .close:focus { - color: #000; - text-decoration: none; - cursor: pointer; - opacity: 0.5; - filter: alpha(opacity=50); -} - -button.close { - padding: 0; - cursor: pointer; - background: transparent; - border: 0; - -webkit-appearance: none; -} - -.modal-open { - overflow: hidden; -} - -.modal { - display: none; - overflow: hidden; - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1050; - -webkit-overflow-scrolling: touch; - outline: 0; -} -.modal.fade .modal-dialog { - -webkit-transform: translate(0, -25%); - -ms-transform: translate(0, -25%); - -o-transform: translate(0, -25%); - transform: translate(0, -25%); - -webkit-transition: -webkit-transform 0.3s ease-out; - -moz-transition: -moz-transform 0.3s ease-out; - -o-transition: -o-transform 0.3s ease-out; - transition: transform 0.3s ease-out; -} -.modal.in .modal-dialog { - -webkit-transform: translate(0, 0); - -ms-transform: translate(0, 0); - -o-transform: translate(0, 0); - transform: translate(0, 0); -} - -.modal-open .modal { - overflow-x: hidden; - overflow-y: auto; -} - -.modal-dialog { - position: relative; - width: auto; - margin: 10px; -} - -.modal-content { - position: relative; - background-color: #fff; - border: 1px solid #999; - border: 1px solid rgba(0, 0, 0, 0.2); - border-radius: 6px; - -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); - box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); - background-clip: padding-box; - outline: 0; -} - -.modal-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1040; - background-color: #000; -} -.modal-backdrop.fade { - opacity: 0; - filter: alpha(opacity=0); -} -.modal-backdrop.in { - opacity: 0.5; - filter: alpha(opacity=50); -} - -.modal-header { - padding: 15px; - border-bottom: 1px solid #e5e5e5; - min-height: 16.42857143px; -} - -.modal-header .close { - margin-top: -2px; -} - -.modal-title { - margin: 0; - line-height: 1.42857143; -} - -.modal-body { - position: relative; - padding: 15px; -} - -.modal-footer { - padding: 15px; - text-align: right; - border-top: 1px solid #e5e5e5; -} -.modal-footer:before, .modal-footer:after { - content: " "; - display: table; -} -.modal-footer:after { - clear: both; -} -.modal-footer .btn + .btn { - margin-left: 5px; - margin-bottom: 0; -} -.modal-footer .btn-group .btn + .btn { - margin-left: -1px; -} -.modal-footer .btn-block + .btn-block { - margin-left: 0; -} - -.modal-scrollbar-measure { - position: absolute; - top: -9999px; - width: 50px; - height: 50px; - overflow: scroll; -} - -@media (min-width: 768px) { - .modal-dialog { - width: 600px; - margin: 30px auto; - } - - .modal-content { - -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); - box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); - } - - .modal-sm { - width: 300px; - } -} -@media (min-width: 992px) { - .modal-lg { - width: 900px; - } -} -.tooltip { - position: absolute; - z-index: 1070; - display: block; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-style: normal; - font-weight: normal; - letter-spacing: normal; - line-break: auto; - line-height: 1.42857143; - text-align: left; - text-align: start; - text-decoration: none; - text-shadow: none; - text-transform: none; - white-space: normal; - word-break: normal; - word-spacing: normal; - word-wrap: normal; - font-size: 12px; - opacity: 0; - filter: alpha(opacity=0); -} -.tooltip.in { - opacity: 0.9; - filter: alpha(opacity=90); -} -.tooltip.top { - margin-top: -3px; - padding: 5px 0; -} -.tooltip.right { - margin-left: 3px; - padding: 0 5px; -} -.tooltip.bottom { - margin-top: 3px; - padding: 5px 0; -} -.tooltip.left { - margin-left: -3px; - padding: 0 5px; -} - -.tooltip-inner { - max-width: 200px; - padding: 3px 8px; - color: #fff; - text-align: center; - background-color: #000; - border-radius: 4px; -} - -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} - -.tooltip.top .tooltip-arrow { - bottom: 0; - left: 50%; - margin-left: -5px; - border-width: 5px 5px 0; - border-top-color: #000; -} -.tooltip.top-left .tooltip-arrow { - bottom: 0; - right: 5px; - margin-bottom: -5px; - border-width: 5px 5px 0; - border-top-color: #000; -} -.tooltip.top-right .tooltip-arrow { - bottom: 0; - left: 5px; - margin-bottom: -5px; - border-width: 5px 5px 0; - border-top-color: #000; -} -.tooltip.right .tooltip-arrow { - top: 50%; - left: 0; - margin-top: -5px; - border-width: 5px 5px 5px 0; - border-right-color: #000; -} -.tooltip.left .tooltip-arrow { - top: 50%; - right: 0; - margin-top: -5px; - border-width: 5px 0 5px 5px; - border-left-color: #000; -} -.tooltip.bottom .tooltip-arrow { - top: 0; - left: 50%; - margin-left: -5px; - border-width: 0 5px 5px; - border-bottom-color: #000; -} -.tooltip.bottom-left .tooltip-arrow { - top: 0; - right: 5px; - margin-top: -5px; - border-width: 0 5px 5px; - border-bottom-color: #000; -} -.tooltip.bottom-right .tooltip-arrow { - top: 0; - left: 5px; - margin-top: -5px; - border-width: 0 5px 5px; - border-bottom-color: #000; -} - -.popover { - position: absolute; - top: 0; - left: 0; - z-index: 1060; - display: none; - max-width: 276px; - padding: 1px; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-style: normal; - font-weight: normal; - letter-spacing: normal; - line-break: auto; - line-height: 1.42857143; - text-align: left; - text-align: start; - text-decoration: none; - text-shadow: none; - text-transform: none; - white-space: normal; - word-break: normal; - word-spacing: normal; - word-wrap: normal; - font-size: 14px; - background-color: #fff; - background-clip: padding-box; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.2); - border-radius: 6px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); -} -.popover.top { - margin-top: -10px; -} -.popover.right { - margin-left: 10px; -} -.popover.bottom { - margin-top: 10px; -} -.popover.left { - margin-left: -10px; -} - -.popover-title { - margin: 0; - padding: 8px 14px; - font-size: 14px; - background-color: #f7f7f7; - border-bottom: 1px solid #ebebeb; - border-radius: 5px 5px 0 0; -} - -.popover-content { - padding: 9px 14px; -} - -.popover > .arrow, .popover > .arrow:after { - position: absolute; - display: block; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} - -.popover > .arrow { - border-width: 11px; -} - -.popover > .arrow:after { - border-width: 10px; - content: ""; -} - -.popover.top > .arrow { - left: 50%; - margin-left: -11px; - border-bottom-width: 0; - border-top-color: #999999; - border-top-color: rgba(0, 0, 0, 0.25); - bottom: -11px; -} -.popover.top > .arrow:after { - content: " "; - bottom: 1px; - margin-left: -10px; - border-bottom-width: 0; - border-top-color: #fff; -} -.popover.right > .arrow { - top: 50%; - left: -11px; - margin-top: -11px; - border-left-width: 0; - border-right-color: #999999; - border-right-color: rgba(0, 0, 0, 0.25); -} -.popover.right > .arrow:after { - content: " "; - left: 1px; - bottom: -10px; - border-left-width: 0; - border-right-color: #fff; -} -.popover.bottom > .arrow { - left: 50%; - margin-left: -11px; - border-top-width: 0; - border-bottom-color: #999999; - border-bottom-color: rgba(0, 0, 0, 0.25); - top: -11px; -} -.popover.bottom > .arrow:after { - content: " "; - top: 1px; - margin-left: -10px; - border-top-width: 0; - border-bottom-color: #fff; -} -.popover.left > .arrow { - top: 50%; - right: -11px; - margin-top: -11px; - border-right-width: 0; - border-left-color: #999999; - border-left-color: rgba(0, 0, 0, 0.25); -} -.popover.left > .arrow:after { - content: " "; - right: 1px; - border-right-width: 0; - border-left-color: #fff; - bottom: -10px; -} - -.carousel { - position: relative; -} - -.carousel-inner { - position: relative; - overflow: hidden; - width: 100%; -} -.carousel-inner > .item { - display: none; - position: relative; - -webkit-transition: 0.6s ease-in-out left; - -o-transition: 0.6s ease-in-out left; - transition: 0.6s ease-in-out left; -} -.carousel-inner > .item > img, -.carousel-inner > .item > a > img { - display: block; - max-width: 100%; - height: auto; - line-height: 1; -} -@media all and (transform-3d), (-webkit-transform-3d) { - .carousel-inner > .item { - -webkit-transition: -webkit-transform 0.6s ease-in-out; - -moz-transition: -moz-transform 0.6s ease-in-out; - -o-transition: -o-transform 0.6s ease-in-out; - transition: transform 0.6s ease-in-out; - -webkit-backface-visibility: hidden; - -moz-backface-visibility: hidden; - backface-visibility: hidden; - -webkit-perspective: 1000px; - -moz-perspective: 1000px; - perspective: 1000px; - } - .carousel-inner > .item.next, .carousel-inner > .item.active.right { - -webkit-transform: translate3d(100%, 0, 0); - transform: translate3d(100%, 0, 0); - left: 0; - } - .carousel-inner > .item.prev, .carousel-inner > .item.active.left { - -webkit-transform: translate3d(-100%, 0, 0); - transform: translate3d(-100%, 0, 0); - left: 0; - } - .carousel-inner > .item.next.left, .carousel-inner > .item.prev.right, .carousel-inner > .item.active { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - left: 0; - } -} -.carousel-inner > .active, -.carousel-inner > .next, -.carousel-inner > .prev { - display: block; -} -.carousel-inner > .active { - left: 0; -} -.carousel-inner > .next, -.carousel-inner > .prev { - position: absolute; - top: 0; - width: 100%; -} -.carousel-inner > .next { - left: 100%; -} -.carousel-inner > .prev { - left: -100%; -} -.carousel-inner > .next.left, -.carousel-inner > .prev.right { - left: 0; -} -.carousel-inner > .active.left { - left: -100%; -} -.carousel-inner > .active.right { - left: 100%; -} - -.carousel-control { - position: absolute; - top: 0; - left: 0; - bottom: 0; - width: 15%; - opacity: 0.5; - filter: alpha(opacity=50); - font-size: 20px; - color: #fff; - text-align: center; - text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); -} -.carousel-control.left { - background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); - background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); - background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); -} -.carousel-control.right { - left: auto; - right: 0; - background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); - background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); - background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); -} -.carousel-control:hover, .carousel-control:focus { - outline: 0; - color: #fff; - text-decoration: none; - opacity: 0.9; - filter: alpha(opacity=90); -} -.carousel-control .icon-prev, -.carousel-control .icon-next, -.carousel-control .glyphicon-chevron-left, -.carousel-control .glyphicon-chevron-right { - position: absolute; - top: 50%; - margin-top: -10px; - z-index: 5; - display: inline-block; -} -.carousel-control .icon-prev, -.carousel-control .glyphicon-chevron-left { - left: 50%; - margin-left: -10px; -} -.carousel-control .icon-next, -.carousel-control .glyphicon-chevron-right { - right: 50%; - margin-right: -10px; -} -.carousel-control .icon-prev, -.carousel-control .icon-next { - width: 20px; - height: 20px; - line-height: 1; - font-family: serif; -} -.carousel-control .icon-prev:before { - content: '\2039'; -} -.carousel-control .icon-next:before { - content: '\203a'; -} - -.carousel-indicators { - position: absolute; - bottom: 10px; - left: 50%; - z-index: 15; - width: 60%; - margin-left: -30%; - padding-left: 0; - list-style: none; - text-align: center; -} -.carousel-indicators li { - display: inline-block; - width: 10px; - height: 10px; - margin: 1px; - text-indent: -999px; - border: 1px solid #fff; - border-radius: 10px; - cursor: pointer; - background-color: #000 \9; - background-color: transparent; -} -.carousel-indicators .active { - margin: 0; - width: 12px; - height: 12px; - background-color: #fff; -} - -.carousel-caption { - position: absolute; - left: 15%; - right: 15%; - bottom: 20px; - z-index: 10; - padding-top: 20px; - padding-bottom: 20px; - color: #fff; - text-align: center; - text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); -} -.carousel-caption .btn { - text-shadow: none; -} - -@media screen and (min-width: 768px) { - .carousel-control .glyphicon-chevron-left, - .carousel-control .glyphicon-chevron-right, - .carousel-control .icon-prev, - .carousel-control .icon-next { - width: 30px; - height: 30px; - margin-top: -15px; - font-size: 30px; - } - .carousel-control .glyphicon-chevron-left, - .carousel-control .icon-prev { - margin-left: -15px; - } - .carousel-control .glyphicon-chevron-right, - .carousel-control .icon-next { - margin-right: -15px; - } - - .carousel-caption { - left: 20%; - right: 20%; - padding-bottom: 30px; - } - - .carousel-indicators { - bottom: 20px; - } -} -.clearfix:before, .clearfix:after { - content: " "; - display: table; -} -.clearfix:after { - clear: both; -} - -.center-block { - display: block; - margin-left: auto; - margin-right: auto; -} - -.pull-right { - float: right !important; -} - -.pull-left { - float: left !important; -} - -.hide { - display: none !important; -} - -.show { - display: block !important; -} - -.invisible { - visibility: hidden; -} - -.text-hide { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} - -.hidden { - display: none !important; -} - -.affix { - position: fixed; -} - -@-ms-viewport { - width: device-width; -} -.visible-xs { - display: none !important; -} - -.visible-sm { - display: none !important; -} - -.visible-md { - display: none !important; -} - -.visible-lg { - display: none !important; -} - -.visible-xs-block, -.visible-xs-inline, -.visible-xs-inline-block, -.visible-sm-block, -.visible-sm-inline, -.visible-sm-inline-block, -.visible-md-block, -.visible-md-inline, -.visible-md-inline-block, -.visible-lg-block, -.visible-lg-inline, -.visible-lg-inline-block { - display: none !important; -} - -@media (max-width: 767px) { - .visible-xs { - display: block !important; - } - - table.visible-xs { - display: table !important; - } - - tr.visible-xs { - display: table-row !important; - } - - th.visible-xs, - td.visible-xs { - display: table-cell !important; - } -} -@media (max-width: 767px) { - .visible-xs-block { - display: block !important; - } -} - -@media (max-width: 767px) { - .visible-xs-inline { - display: inline !important; - } -} - -@media (max-width: 767px) { - .visible-xs-inline-block { - display: inline-block !important; - } -} - -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm { - display: block !important; - } - - table.visible-sm { - display: table !important; - } - - tr.visible-sm { - display: table-row !important; - } - - th.visible-sm, - td.visible-sm { - display: table-cell !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm-block { - display: block !important; - } -} - -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm-inline { - display: inline !important; - } -} - -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm-inline-block { - display: inline-block !important; - } -} - -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md { - display: block !important; - } - - table.visible-md { - display: table !important; - } - - tr.visible-md { - display: table-row !important; - } - - th.visible-md, - td.visible-md { - display: table-cell !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md-block { - display: block !important; - } -} - -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md-inline { - display: inline !important; - } -} - -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md-inline-block { - display: inline-block !important; - } -} - -@media (min-width: 1200px) { - .visible-lg { - display: block !important; - } - - table.visible-lg { - display: table !important; - } - - tr.visible-lg { - display: table-row !important; - } - - th.visible-lg, - td.visible-lg { - display: table-cell !important; - } -} -@media (min-width: 1200px) { - .visible-lg-block { - display: block !important; - } -} - -@media (min-width: 1200px) { - .visible-lg-inline { - display: inline !important; - } -} - -@media (min-width: 1200px) { - .visible-lg-inline-block { - display: inline-block !important; - } -} - -@media (max-width: 767px) { - .hidden-xs { - display: none !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .hidden-sm { - display: none !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .hidden-md { - display: none !important; - } -} -@media (min-width: 1200px) { - .hidden-lg { - display: none !important; - } -} -.visible-print { - display: none !important; -} - -@media print { - .visible-print { - display: block !important; - } - - table.visible-print { - display: table !important; - } - - tr.visible-print { - display: table-row !important; - } - - th.visible-print, - td.visible-print { - display: table-cell !important; - } -} -.visible-print-block { - display: none !important; -} -@media print { - .visible-print-block { - display: block !important; - } -} - -.visible-print-inline { - display: none !important; -} -@media print { - .visible-print-inline { - display: inline !important; - } -} - -.visible-print-inline-block { - display: none !important; -} -@media print { - .visible-print-inline-block { - display: inline-block !important; - } -} - -@media print { - .hidden-print { - display: none !important; - } -} -.well { - -webkit-box-shadow: rgba(255, 255, 255, 0.1) 0 1px 0, rgba(0, 0, 0, 0.8) 0 1px 7px 0px inset; - box-shadow: rgba(255, 255, 255, 0.1) 0 1px 0, rgba(0, 0, 0, 0.8) 0 1px 7px 0px inset; - background: #202020; - background-color: rgba(0, 0, 0, 0.3); - border: 0; -} - -.darkwell, .breadcrumb, code, pre, select, -input[type="text"], -input[type="password"], -input[type="datetime"], -input[type="datetime-local"], -input[type="date"], -input[type="month"], -input[type="time"], -input[type="week"], -input[type="number"], -input[type="email"], -input[type="url"], -input[type="search"], -input[type="tel"], -input[type="color"], -.uneditable-input, -.form-control, textarea, .jumbotron, .progress { - -webkit-box-shadow: rgba(255, 255, 255, 0.1) 0 1px 0, rgba(0, 0, 0, 0.8) 0 1px 7px 0px inset; - box-shadow: rgba(255, 255, 255, 0.1) 0 1px 0, rgba(0, 0, 0, 0.8) 0 1px 7px 0px inset; - background: #202020; - background-color: rgba(0, 0, 0, 0.3); - border: 0; -} - -.breadcrumb { - border: 0; -} -.breadcrumb li { - text-shadow: 0 1px 0 #000; -} - -.page-header { - -webkit-box-shadow: rgba(255, 255, 255, 0.07) 0 1px 0; - box-shadow: rgba(255, 255, 255, 0.07) 0 1px 0; - border-bottom: 1px solid #121212; -} - -h1, h2, h3, h4, h5, h6 { - color: #fff; -} - -h6 { - color: #999; -} - -blockquote { - border-left-color: #111; -} -blockquote.pull-right { - border-right-color: #111; -} - -hr { - -webkit-box-shadow: rgba(255, 255, 255, 0.07) 0 1px 0; - box-shadow: rgba(255, 255, 255, 0.07) 0 1px 0; - border-bottom: 1px solid #121212; - border-top: none; -} - -code { - border: none; - padding: 2px 4px; -} - -pre { - border: none; - color: #c6c6c6; - padding: 8px; -} - -legend { - -webkit-box-shadow: rgba(255, 255, 255, 0.07) 0 1px 0; - box-shadow: rgba(255, 255, 255, 0.07) 0 1px 0; - border-bottom: 1px solid #121212; - color: #fff; -} - -select, -input[type="text"], -input[type="password"], -input[type="datetime"], -input[type="datetime-local"], -input[type="date"], -input[type="month"], -input[type="time"], -input[type="week"], -input[type="number"], -input[type="email"], -input[type="url"], -input[type="search"], -input[type="tel"], -input[type="color"], -.uneditable-input, -.form-control { - color: #fff; - height: 34px; -} -select::-moz-placeholder, -input[type="text"]::-moz-placeholder, -input[type="password"]::-moz-placeholder, -input[type="datetime"]::-moz-placeholder, -input[type="datetime-local"]::-moz-placeholder, -input[type="date"]::-moz-placeholder, -input[type="month"]::-moz-placeholder, -input[type="time"]::-moz-placeholder, -input[type="week"]::-moz-placeholder, -input[type="number"]::-moz-placeholder, -input[type="email"]::-moz-placeholder, -input[type="url"]::-moz-placeholder, -input[type="search"]::-moz-placeholder, -input[type="tel"]::-moz-placeholder, -input[type="color"]::-moz-placeholder, -.uneditable-input::-moz-placeholder, -.form-control::-moz-placeholder { - color: #999; - opacity: 1; -} -select:-ms-input-placeholder, -input[type="text"]:-ms-input-placeholder, -input[type="password"]:-ms-input-placeholder, -input[type="datetime"]:-ms-input-placeholder, -input[type="datetime-local"]:-ms-input-placeholder, -input[type="date"]:-ms-input-placeholder, -input[type="month"]:-ms-input-placeholder, -input[type="time"]:-ms-input-placeholder, -input[type="week"]:-ms-input-placeholder, -input[type="number"]:-ms-input-placeholder, -input[type="email"]:-ms-input-placeholder, -input[type="url"]:-ms-input-placeholder, -input[type="search"]:-ms-input-placeholder, -input[type="tel"]:-ms-input-placeholder, -input[type="color"]:-ms-input-placeholder, -.uneditable-input:-ms-input-placeholder, -.form-control:-ms-input-placeholder { - color: #999; -} -select::-webkit-input-placeholder, -input[type="text"]::-webkit-input-placeholder, -input[type="password"]::-webkit-input-placeholder, -input[type="datetime"]::-webkit-input-placeholder, -input[type="datetime-local"]::-webkit-input-placeholder, -input[type="date"]::-webkit-input-placeholder, -input[type="month"]::-webkit-input-placeholder, -input[type="time"]::-webkit-input-placeholder, -input[type="week"]::-webkit-input-placeholder, -input[type="number"]::-webkit-input-placeholder, -input[type="email"]::-webkit-input-placeholder, -input[type="url"]::-webkit-input-placeholder, -input[type="search"]::-webkit-input-placeholder, -input[type="tel"]::-webkit-input-placeholder, -input[type="color"]::-webkit-input-placeholder, -.uneditable-input::-webkit-input-placeholder, -.form-control::-webkit-input-placeholder { - color: #999; -} - -.form-control.input-lg, .input-group-lg > .form-control, -.input-group-lg > .input-group-btn > .form-control.btn { - height: 45px; -} - -textarea { - color: #fff; -} -textarea::-moz-placeholder { - color: #999; - opacity: 1; -} -textarea:-ms-input-placeholder { - color: #999; -} -textarea::-webkit-input-placeholder { - color: #999; -} - -select { - height: 29px; -} - -.form-actions { - border-top-color: #222; -} - -.well .form-actions { - border-top-color: #000; - background-color: rgba(0, 0, 0, 0.3); - margin-left: -17px; - margin-right: -17px; - margin-bottom: -17px; -} - -.help-inline, -.help-block { - color: #999; -} - -tr.warning, -tr.success, -tr.error, -tr.info { - color: #fff; -} - -.control-group.warning input, .control-group.warning select, .control-group.warning textarea { - color: #faa732; - border-color: #faa732; - -webkit-box-shadow: rgba(255, 255, 255, 0.1) 0 1px 0, rgba(0, 0, 0, 0.8) 0 1px 7px 0px inset; - box-shadow: rgba(255, 255, 255, 0.1) 0 1px 0, rgba(0, 0, 0, 0.8) 0 1px 7px 0px inset; - background: #202020; - background-color: rgba(0, 0, 0, 0.3); -} -.control-group.warning input:focus, -.control-group.warning select:focus, -.control-group.warning textarea:focus { - border-color: #faa732; - -webkit-box-shadow: 0 0 6px #faa732; - box-shadow: 0 0 6px #faa732; -} -.control-group.warning .control-label, -.control-group.warning .help-block, -.control-group.warning .help-inline { - color: #faa732; -} -.control-group.success input, .control-group.success select, .control-group.success textarea { - color: #5bb75b; - border-color: #5bb75b; - -webkit-box-shadow: rgba(255, 255, 255, 0.1) 0 1px 0, rgba(0, 0, 0, 0.8) 0 1px 7px 0px inset; - box-shadow: rgba(255, 255, 255, 0.1) 0 1px 0, rgba(0, 0, 0, 0.8) 0 1px 7px 0px inset; - background: #202020; - background-color: rgba(0, 0, 0, 0.3); -} -.control-group.success input:focus, -.control-group.success select:focus, -.control-group.success textarea:focus { - border-color: #5bb75b; - -webkit-box-shadow: 0 0 6px #5bb75b; - box-shadow: 0 0 6px #5bb75b; -} -.control-group.success .control-label, -.control-group.success .help-block, -.control-group.success .help-inline { - color: #5bb75b; -} -.control-group.error input, .control-group.error select, .control-group.error textarea { - color: #fc5b5e; - border-color: #fc5b5e; - -webkit-box-shadow: rgba(255, 255, 255, 0.1) 0 1px 0, rgba(0, 0, 0, 0.8) 0 1px 7px 0px inset; - box-shadow: rgba(255, 255, 255, 0.1) 0 1px 0, rgba(0, 0, 0, 0.8) 0 1px 7px 0px inset; - background: #202020; - background-color: rgba(0, 0, 0, 0.3); -} -.control-group.error input:focus, -.control-group.error select:focus, -.control-group.error textarea:focus { - border-color: #fc5b5e; - -webkit-box-shadow: 0 0 6px #fc5b5e; - box-shadow: 0 0 6px #fc5b5e; -} -.control-group.error .control-label, -.control-group.error .help-block, -.control-group.error .help-inline { - color: #fc5b5e; -} -.control-group.info input, .control-group.info select, .control-group.info textarea { - color: #3a87ad; - border-color: #3a87ad; - -webkit-box-shadow: rgba(255, 255, 255, 0.1) 0 1px 0, rgba(0, 0, 0, 0.8) 0 1px 7px 0px inset; - box-shadow: rgba(255, 255, 255, 0.1) 0 1px 0, rgba(0, 0, 0, 0.8) 0 1px 7px 0px inset; - background: #202020; - background-color: rgba(0, 0, 0, 0.3); -} -.control-group.info input:focus, -.control-group.info select:focus, -.control-group.info textarea:focus { - border-color: #3a87ad; - -webkit-box-shadow: 0 0 6px #3a87ad; - box-shadow: 0 0 6px #3a87ad; -} -.control-group.info .control-label, -.control-group.info .help-block, -.control-group.info .help-inline { - color: #3a87ad; -} - -input:focus:invalid, -textarea:focus:invalid, -select:focus:invalid { - border-color: #fc5b5e; -} - -input:focus:invalid:focus, -textarea:focus:invalid:focus, -select:focus:invalid:focus { - border-color: #fc5b5e; - box-shadow: 0 0 6px #fc5b5e; -} - -.btn-link { - text-shadow: none; -} - -.img-polaroid { - background-color: #111; - background-color: rgba(0, 0, 0, 0.3); -} - -.nav-tabs .open .dropdown-toggle, -.nav-pills .open .dropdown-toggle, -.nav > .open.active > a:hover { - background-color: rgba(0, 0, 0, 0.25); - border-color: transparent transparent #666 transparent; -} - -.nav > .dropdown.active > a:hover { - color: #fff; -} - -.nav-tabs .active .dropdown-toggle .caret, -.nav-pills .active .dropdown-toggle .caret { - border-top-color: #fff; -} - -.nav-tabs { - border-bottom: 1px solid #666; -} -.nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus { - background-color: #2f2f2f; - color: #fff; - border-color: #666 #666 transparent #666; -} -.nav-tabs > li > a:hover { - border-color: #2f2f2f #2f2f2f #666 #2f2f2f; - background-color: rgba(0, 0, 0, 0.25); - color: #00aaff; -} -.nav-tabs.nav-stacked > li > a, .nav-tabs.nav-stacked > li > a:hover { - border-color: #666; -} - -.well > .nav-tabs > .active > a, .well > .nav-tabs > .active > a:hover { - background-color: #202020; -} - -.nav-pills > li > a:hover { - background-color: rgba(0, 0, 0, 0.25); - color: #00aaff; -} - -.nav-list > li > a, -.nav-list .nav-header { - text-shadow: 0 1px 0 #000; -} - -.nav-list > li > a:hover { - background-color: rgba(0, 0, 0, 0.25); - color: #00aaff; -} - -.nav-list .active > a:hover { - background-color: #0088cc; - color: #fff; -} - -.tabs-below .nav-tabs { - border-top: 1px solid #666; -} - -.tabs-left .nav-tabs { - border-right: 1px solid #666; -} - -.tabs-right .nav-tabs { - border-left: 1px solid #666; -} - -.tabs-below .nav-tabs > li > a:hover { - border-top: 1px solid #666; -} - -.tabs-left .nav-tabs > li > a:hover { - border-color: transparent #666 transparent transparent; -} - -.tabs-right .nav-tabs > li > a:hover { - border-color: transparent transparent transparent #666; -} - -.tabs-below .nav-tabs .active > a, -.tabs-below .nav-tabs .active > a:hover { - border-color: transparent #666 #666 #666; -} - -.tabs-left .nav-tabs .active > a, -.tabs-left .nav-tabs .active > a:hover { - border-color: #666 transparent #666 #666; -} - -.tabs-right .nav-tabs .active > a, -.tabs-right .nav-tabs .active > a:hover { - border-color: #666 #666 #666 transparent; -} - -.nav-list > li > a, -.nav-list .nav-header { - text-shadow: 0 1px 0 rgba(0, 0, 0, 0.5); -} - -.nav-tabs > li > a:hover { - border-color: transparent transparent #666 transparent; -} - -.nav > .disabled > a:hover { - color: #999; -} - -.nav-list .divider { - background-color: transparent; - -webkit-box-shadow: rgba(255, 255, 255, 0.07) 0 1px 0; - box-shadow: rgba(255, 255, 255, 0.07) 0 1px 0; - border-bottom: 1px solid #121212; -} - -.navbar .brand { - text-shadow: 0 1px 0 black; -} - -.navbar .nav-divider { - border: transparent; - -webkit-box-shadow: rgba(255, 255, 255, 0.07) 1px 0 0; - box-shadow: rgba(255, 255, 255, 0.07) 1px 0 0; - border-right: 1px solid #121212; -} - -.navbar-inverse .brand { - color: #555; -} -.navbar-inverse .brand:hover { - color: #555; -} -.navbar-inverse .navbar-default { - background: #333; - box-shadow: 0 1px 4px rgba(0, 0, 0, 0.5); -} -.navbar-inverse .nav > li > a { - color: #c6c6c6; -} -.navbar-inverse .nav > li > a:hover { - color: #fff; -} -.navbar-inverse .nav > .active > a, -.navbar-inverse .nav > .active > a:hover { - background-color: #e5e5e5; - box-shadow: 0 3px 8px rgba(0, 0, 0, 0.125) inset; - color: #555; -} -.navbar-inverse .nav li.dropdown > a:hover .caret { - border-bottom-color: #fff; - border-top-color: #fff; - color: #fff; -} -.navbar-inverse .nav > li > a:focus, -.navbar-inverse .nav > li > a:hover { - background-color: transparent; - color: #fff; -} -.navbar-inverse .nav li.dropdown.open > .dropdown-toggle, -.navbar-inverse .nav li.dropdown.active > .dropdown-toggle, -.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle { - background-color: #e5e5e5; - color: #555; -} -.navbar-inverse .nav li.dropdown.open > .dropdown-toggle, -.navbar-inverse .nav li.dropdown.active > .dropdown-toggle, -.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle { - background-color: #e5e5e5; - color: #555; -} -.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret, -.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret, -.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret { - border-bottom-color: #c6c6c6; - border-top-color: #c6c6c6; - color: #c6c6c6; -} -.navbar-inverse .navbar-search .search-query { - box-shadow: 0 3px 8px rgba(0, 0, 0, 0.6) inset; - background-color: #fff; - color: #555; -} -.navbar-inverse .navbar-search input.search-query:focus { - box-shadow: 0 3px 8px rgba(0, 0, 0, 0.6) inset, 0 0 8px rgba(82, 168, 236, 0.9); - padding: 4px 14px; - outline: 0 none; -} -.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret { - border-bottom-color: #c6c6c6; - border-top-color: #c6c6c6; -} -.navbar-inverse .nav li.dropdown > a:hover .caret { - border-bottom-color: #fff; - border-top-color: #fff; -} -.navbar-inverse .navbar-search .search-query:-moz-placeholder { - color: #999; -} - -.pagination > li > a, -.pagination > li > span { - background: transparent; - border-color: #666; -} - -.pagination > li > a:hover, -.pagination > .active > a, -.pagination > .active > span { - background-color: rgba(0, 0, 0, 0.25); -} - -.pager li > a, .pager li > span { - background-color: transparent; - border-color: #666; -} - -.pager li > a:hover { - background-color: rgba(0, 0, 0, 0.25); -} - -.pager .disabled > a, -.pager .disabled > a:hover, -.pager .disabled > span { - background-color: transparent; -} - -.label, -.badge { - text-shadow: 1px 1px 0 black; - box-shadow: 1px 1px 0 black; -} - -.label-inverse, -.badge-inverse { - background-color: #111; -} - -.btn-inverse { - background-color: #373737; -} - -.btn-inverse, -.btn-inverse:hover { - color: #C6C6C6; -} - -a.list-group-item.active > .badge, -.nav-pills > .active > a > .badge { - color: #fff; - background-color: #2f2f2f; -} - -.jumbotron { - background: #111; - color: #ccc; -} - -.thumbnail { - display: inline-block; - display: block; - height: auto; - max-width: 100%; - padding: 4px; - line-height: 1.428571429; - background-color: #333333; - border: 1px solid #dddddd; - border-radius: 4px; - -webkit-transition: all 0.2s ease-in-out; - transition: all 0.2s ease-in-out; -} -.thumbnail .caption { - color: #999; -} - -.alert { - color: #fff; - border-color: #a86404; -} -.alert h1, .alert h2, .alert h3, .alert h4, .alert h5, .alert h6 { - color: #c17305; -} - -.alert-error { - border-color: #d40408; -} -.alert-error h1, .alert-error h2, .alert-error h3, .alert-error h4, .alert-error h5, .alert-error h6 { - color: #ed0409; -} - -.alert-success { - border-color: #2d662d; -} -.alert-success h1, .alert-success h2, .alert-success h3, .alert-success h4, .alert-success h5, .alert-success h6 { - color: #347834; -} - -.alert-info { - border-color: #1a3c4e; -} -.alert-info h1, .alert-info h2, .alert-info h3, .alert-info h4, .alert-info h5, .alert-info h6 { - color: #204b61; -} - -select::-webkit-scrollbar { - -webkit-appearance: none; - width: 11px; -} -select::-webkit-scrollbar-thumb { - border-radius: 8px; - border: 2px solid #202020; - /* should match background, can't be transparent */ - background-color: rgba(0, 0, 0, 0.5); -} - -.modal, -.modal-content { - background-color: #444; -} - -.modal-header { - border-bottom: 1px solid #222; -} - -.modal-body p { - color: #c6c6c6; -} - -.modal-footer { - background-color: #373737; - border-top: 1px solid #222; - -moz-box-shadow: 0 1px 0 #333333 inset; - -webkit-box-shadow: 0 1px 0 #333333 inset; - -o-box-shadow: 0 1px 0 #333333 inset; - box-shadow: 0 1px 0 #333333 inset; -} - -.popover { - background: #444; - border: 1px solid rgba(0, 0, 0, 0.5); - border: 1px solid black; -} - -.popover-title { - background: #373737; - border-bottom-color: #222; -} - -.popover.top .arrow:after { - border-top-color: #444; -} - -.popover.right .arrow:after { - border-right-color: #444; -} - -.popover.bottom .arrow:after { - border-bottom-color: #444; -} - -.popover.left .arrow:after { - border-left-color: #444; -} - -.dropdown-menu, -.dropdown-menu > li > a { - color: #c6c6c6; - background: #373737; -} - -.dropdown-menu > li > a:focus, -.dropdown-menu > li > a:hover { - color: #fff; - background-image: -webkit-linear-gradient(top, #080808 0, #0f0f0f 100%); - background-image: -o-linear-gradient(top, #080808 0, #0f0f0f 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f)); - background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); - background-repeat: repeat-x; -} - -.alert { - background-image: -webkit-linear-gradient(top, #faa732 0, #c17305 100%); - background-image: -o-linear-gradient(top, #faa732 0, #c17305 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#faa732), to(#c17305)); - background-image: linear-gradient(to bottom, #faa732 0%, #c17305 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3a87ad', endColorstr='#ff1a3c4e', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); - background-repeat: repeat-x; -} - -.alert-error { - background-image: -webkit-linear-gradient(top, #fc5b5e 0, #d40408 100%); - background-image: -o-linear-gradient(top, #fc5b5e 0, #d40408 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#fc5b5e), to(#d40408)); - background-image: linear-gradient(to bottom, #fc5b5e 0%, #d40408 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3a87ad', endColorstr='#ff1a3c4e', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); - background-repeat: repeat-x; -} - -.alert-success { - background-image: -webkit-linear-gradient(top, #5bb75b 0, #2d662d 100%); - background-image: -o-linear-gradient(top, #5bb75b 0, #2d662d 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#5bb75b), to(#2d662d)); - background-image: linear-gradient(to bottom, #5bb75b 0%, #2d662d 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3a87ad', endColorstr='#ff1a3c4e', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); - background-repeat: repeat-x; -} - -.alert-info { - background-image: -webkit-linear-gradient(top, #3a87ad 0, #1a3c4e 100%); - background-image: -o-linear-gradient(top, #3a87ad 0, #1a3c4e 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#3a87ad), to(#1a3c4e)); - background-image: linear-gradient(to bottom, #3a87ad 0%, #1a3c4e 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3a87ad', endColorstr='#ff1a3c4e', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); - background-repeat: repeat-x; -} diff --git a/css/bootstrap/fonts/glyphicons-halflings-regular.eot b/css/bootstrap/fonts/glyphicons-halflings-regular.eot deleted file mode 100644 index b93a4953fff68df523aa7656497ee339d6026d64..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20127 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/css/bootstrap/fonts/glyphicons-halflings-regular.ttf b/css/bootstrap/fonts/glyphicons-halflings-regular.ttf deleted file mode 100644 index 1413fc609ab6f21774de0cb7e01360095584f65b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45404 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 G`u_lkUM?>H diff --git a/css/bootstrap/fonts/glyphicons-halflings-regular.woff2 b/css/bootstrap/fonts/glyphicons-halflings-regular.woff2 deleted file mode 100644 index 64539b54c3751a6d9adb44c8e3a45ba5a73b77f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18028 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 diff --git a/css/bootstrap/privatebin.css b/css/bootstrap/privatebin.css deleted file mode 100644 index 6c4b1028..00000000 --- a/css/bootstrap/privatebin.css +++ /dev/null @@ -1,146 +0,0 @@ -/** - * PrivateBin - * - * a zero-knowledge paste bin - * - * @link https://github.com/PrivateBin/PrivateBin - * @copyright 2012 Sébastien SAUVAGE (sebsauvage.net) - * @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License - * @version 1.2.1 - */ - -body { - padding: 0 0 30px; -} - -body.navbar-spacing { - padding-top: 70px; -} - -body.loading { - cursor: wait; -} - -.buttondisabled { - opacity: 0.3; -} - -.navbar-nav { - margin: 0 8px; -} - -.nav.navbar-nav > li { - margin-left: 8px; -} - -.navbar-brand { - padding: 6px 4px 0 8px; -} - -.navbar-form { - padding: 0; -} - -.dropdown-menu > li > label, .dropdown-menu > li > div { - clear: both; - display: block; - font-weight: normal; - line-height: 1.42857; - white-space: nowrap; -} - -.dropdown-menu > li > label { - color: #333; - padding: 3px 20px 3px 40px; -} - -.dropdown-menu > li > div { - color: #777; - padding: 3px 20px; - cursor: default; -} - -.pull-right .dropdown-menu { - margin-left: -5em; -} - -#language { - margin-right: 8px; -} - -#attachmentPreview img { - max-width: 100%; - height: auto; - margin-bottom: 20px; -} - -#attachmentPreview .pdfPreview { - width: 100%; - height: 100vh; - margin-bottom: 20px; -} - -.dragAndDropFile{ - color:#777; - font-size:1em; - display:inline; -} - - -#deletelink { - float: right; - margin-left: 5px; -} - -#qrcodemodalClose { - float: right; -} -#qrcode-display { - width: 200px; - height: 200px; - margin: auto; -} - -#pastelink { - display: inline; -} - -#pastelink > a { - word-wrap: break-word; -} - -#preview { - margin-bottom: 10px; -} - -#message { - font-family: monospace; -} - -#nickname { - margin: 5px 0; -} - -#comments, #comments button { - margin-bottom: 10px; -} - -.comment { - border-left: 1px solid #ccc; - padding: 5px 0 5px 10px; - white-space: pre-wrap; - transition: background-color 0.75s ease-out; -} - -.comment.highlight { - background-color: #ffdd86; - transition: background-color 0.2s ease-in; -} - -footer h4 { - margin-top: 0; -} - -li.L0, li.L1, li.L2, li.L3, li.L5, li.L6, li.L7, li.L8 { - list-style-type: decimal !important; -} diff --git a/css/noscript.css b/css/noscript.css deleted file mode 100644 index f4c71a18..00000000 --- a/css/noscript.css +++ /dev/null @@ -1,15 +0,0 @@ -/** - * PrivateBin - * - * CSS file only loaded when no JavaScript available. - * - * @link https://github.com/PrivateBin/PrivateBin - * @copyright 2012 Sébastien SAUVAGE (sebsauvage.net) - * @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License - * @version 1.2.1 - */ - -/* When there is no script at all other */ -.noscript-hide { - display: none; -} diff --git a/css/prettify/desert.css b/css/prettify/desert.css deleted file mode 100644 index 138debe9..00000000 --- a/css/prettify/desert.css +++ /dev/null @@ -1 +0,0 @@ -pre .atn,pre .kwd,pre .tag{font-weight:700}pre.prettyprint{display:block;background-color:#333}pre .nocode{background-color:none;color:#000}pre .str{color:#ffa0a0}pre .kwd{color:khaki}pre .com{color:#87ceeb}pre .typ{color:#98fb98}pre .lit{color:#cd5c5c}pre .pln,pre .pun{color:#fff}pre .tag{color:khaki}pre .atn{color:#bdb76b}pre .atv{color:#ffa0a0}pre .dec{color:#98fb98}ol.linenums{margin-top:0;margin-bottom:0;color:#AEAEAE}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}@media print{pre.prettyprint{background-color:none}code .str,pre .str{color:#060}code .kwd,pre .kwd{color:#006;font-weight:700}code .com,pre .com{color:#600;font-style:italic}code .typ,pre .typ{color:#404;font-weight:700}code .lit,pre .lit{color:#044}code .pun,pre .pun{color:#440}code .pln,pre .pln{color:#000}code .tag,pre .tag{color:#006;font-weight:700}code .atn,pre .atn{color:#404}code .atv,pre .atv{color:#060}} \ No newline at end of file diff --git a/css/prettify/doxy.css b/css/prettify/doxy.css deleted file mode 100644 index 8494b449..00000000 --- a/css/prettify/doxy.css +++ /dev/null @@ -1 +0,0 @@ -a,code.prettyprint a,pre.prettyprint a{text-decoration:none}code .str,pre .str{color:#fec243}code .kwd,pre .kwd{color:#8470FF}code .com,pre .com{color:#32cd32;font-style:italic}code .typ,pre .typ{color:#6ecbcc}code .lit,pre .lit{color:#d06}code .pun,pre .pun{color:#8B8970}code .pln,pre .pln{color:#f0f0f0}code .tag,pre .tag{color:#9c9cff}code .htm,pre .htm{color:plum}code .xsl,pre .xsl{color:#d0a0d0}code .atn,pre .atn{color:#46eeee;font-weight:400}code .atv,pre .atv{color:#EEB4B4}code .dec,pre .dec{color:#3387CC}code.prettyprint,pre.prettyprint{font-family:'Droid Sans Mono','CPMono_v07 Bold','Droid Sans';font-weight:700;font-size:9pt;background-color:#0f0f0f;-moz-border-radius:8px;-webkit-border-radius:8px;-o-border-radius:8px;-ms-border-radius:8px;-khtml-border-radius:8px;border-radius:8px}pre.prettyprint{width:95%;margin:1em auto;padding:1em;white-space:pre-wrap}ol.linenums{margin-top:0;margin-bottom:0;color:#8B8970}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}@media print{code.prettyprint,pre.prettyprint{background-color:#fff}code .str,pre .str{color:#088}code .kwd,pre .kwd{color:#006;font-weight:700}code .com,pre .com{color:#oc3;font-style:italic}code .typ,pre .typ{color:#404;font-weight:700}code .lit,pre .lit{color:#044}code .pun,pre .pun{color:#440}code .pln,pre .pln{color:#000}code .tag,pre .tag{color:#b66ff7;font-weight:700}code .htm,code .xsl,pre .htm,pre .xsl{color:#606;font-weight:700}code .atn,pre .atn{color:#c71585;font-weight:400}code .atv,pre .atv{color:#088;font-weight:400}} \ No newline at end of file diff --git a/css/prettify/prettify.css b/css/prettify/prettify.css deleted file mode 100644 index e6fe342f..00000000 --- a/css/prettify/prettify.css +++ /dev/null @@ -1 +0,0 @@ -.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.clo,.opn,.pun{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.kwd,.tag,.typ{font-weight:700}.str{color:#060}.kwd{color:#006}.com{color:#600;font-style:italic}.typ{color:#404}.lit{color:#044}.clo,.opn,.pun{color:#440}.tag{color:#006}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} \ No newline at end of file diff --git a/css/prettify/sons-of-obsidian.css b/css/prettify/sons-of-obsidian.css deleted file mode 100644 index aa078a68..00000000 --- a/css/prettify/sons-of-obsidian.css +++ /dev/null @@ -1 +0,0 @@ -.str{color:#EC7600}.kwd{color:#93C763}.com{color:#66747B}.typ{color:#678CB1}.lit{color:#FACD22}.pln,.pun{color:#F1F2F3}.tag{color:#8AC763}.atn{color:#E0E2E4}.atv{color:#EC7600}.dec{color:purple}pre.prettyprint{border:0 solid #888}ol.linenums{margin-top:0;margin-bottom:0}.prettyprint{background:#000}li.L0,li.L1,li.L2,li.L3,li.L4,li.L5,li.L6,li.L7,li.L8,li.L9{color:#555;list-style-type:decimal}li.L1,li.L3,li.L5,li.L7,li.L9{background:#111}@media print{.kwd,.tag,.typ{font-weight:700}.str{color:#060}.kwd{color:#006}.com{color:#600;font-style:italic}.typ{color:#404}.lit{color:#044}.pun{color:#440}.pln{color:#000}.tag{color:#006}.atn{color:#404}.atv{color:#060}} \ No newline at end of file diff --git a/css/prettify/sunburst.css b/css/prettify/sunburst.css deleted file mode 100644 index 8eb58781..00000000 --- a/css/prettify/sunburst.css +++ /dev/null @@ -1 +0,0 @@ -code .str,pre .str{color:#65B042}code .kwd,pre .kwd{color:#E28964}code .com,pre .com{color:#AEAEAE;font-style:italic}code .typ,pre .typ{color:#89bdff}code .lit,pre .lit{color:#3387CC}code .pln,code .pun,pre .pln,pre .pun{color:#fff}code .tag,pre .tag{color:#89bdff}code .atn,pre .atn{color:#bdb76b}code .atv,pre .atv{color:#65B042}code .dec,pre .dec{color:#3387CC}code.prettyprint,pre.prettyprint{background-color:#000;border-radius:8px}pre.prettyprint{width:95%;margin:1em auto;padding:1em;white-space:pre-wrap}ol.linenums{margin-top:0;margin-bottom:0;color:#AEAEAE}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}@media print{code .str,pre .str{color:#060}code .kwd,pre .kwd{color:#006;font-weight:700}code .com,pre .com{color:#600;font-style:italic}code .typ,pre .typ{color:#404;font-weight:700}code .lit,pre .lit{color:#044}code .pun,pre .pun{color:#440}code .pln,pre .pln{color:#000}code .tag,pre .tag{color:#006;font-weight:700}code .atn,pre .atn{color:#404}code .atv,pre .atv{color:#060}} \ No newline at end of file diff --git a/css/privatebin.css b/css/privatebin.css deleted file mode 100644 index 5dab6c0f..00000000 --- a/css/privatebin.css +++ /dev/null @@ -1,457 +0,0 @@ -/** - * PrivateBin - * - * Main CSS file. - * - * @link https://github.com/PrivateBin/PrivateBin - * @copyright 2012 Sébastien SAUVAGE (sebsauvage.net) - * @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License - * @version 1.2.1 - */ - -/* CSS Reset from YUI 3.4.1 (build 4118) - Copyright 2011 Yahoo! Inc. All rights reserved. -Licensed under the BSD License. - http://yuilibrary.com/license/ */ -html{color:#000;background:#fff}body,div,dl,dt,dd,ul,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;padding:0}table{border-collapse:collapse;border-spacing:0}fieldset,img{border:0}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal}ol,ul{list-style:none}caption,th{text-align:left}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}q:before,q:after{content:''}abbr,acronym{border:0;font-variant:normal}sup{vertical-align:text-top}sub{vertical-align:text-bottom}input,textarea,select{font-family:inherit;font-size:inherit;font-weight:inherit}input,textarea,select{font-size:100%;}legend{color:#000} - -html { - background-color: #455463; - color: #fff; - min-height: 100%; - background-image: linear-gradient(bottom, #0f1823 0, #455463 100%); - background-image: -o-linear-gradient(bottom, #0f1823 0, #455463 100%); - background-image: -moz-linear-gradient(bottom, #0f1823 0, #455463 100%); - background-image: -webkit-linear-gradient(bottom, #0f1823 0, #455463 100%); - background-image: -ms-linear-gradient(bottom, #0f1823 0, #455463 100%); - background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #0f1823), color-stop(1, #455463)); -} - -body { - font-family: Helvetica, Arial, sans-serif; - font-size: 0.9em; - margin-bottom: 15px; - padding-left: 60px; - padding-right: 60px; -} - -a { color: #0f388f; cursor:pointer; } - -h1.title { - font-size: 3.5em; - font-weight: bold; - color: #000; - position: relative; - display: inline; - cursor: pointer; -} - -h1.title:before { - content: attr(title); - position: absolute; - color: rgba(255,255,255,0.15); - top: 1px; - left: 1px; - cursor: pointer; -} - -h2.title { - color: #000; - font-size: 1em; - display: inline; - font-style: italic; - font-weight: bold; - position: relative; - bottom: 8px; -} - -h3.title { - color: #94a3b4; - font-size: 0.7em; - display: inline; - margin-top: 10px; - position: relative; - bottom: 8px; -} - -#aboutbox { - color: #94a3b4; - padding: 4px 8px 4px 16px; - position: relative; - top: 10px; - border-left: 2px solid #94a3b4; - float: right; - width: 60%; -} - -#aboutbox a { color: #94a3b4; } - -#message, #cleartext, #prettymessage, #attachment, .replymessage { - clear: both; - color: #000; - background-color: #fff; - font-size: 9pt; - border: 1px solid #28343F; - box-sizing: border-box; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - -o-box-sizing: border-box; - width: 100%; -} - -#message, .replymessage { - padding: 5px; - white-space: pre-wrap; - font-family: Consolas, "Lucida Console", "DejaVu Sans Mono", Monaco, monospace; -} - -#attachmentPreview img { - max-width: 100%; - height: auto; -} - -#attachmentPreview .pdfPreview { - width: 100%; - height: 100vh; - margin-bottom: 20px; -} - -.dragAndDropFile{ - color:#777; - font-size:1em; - display:inline; -} - -#status { - clear: both; - padding: 5px 10px; -} - -#pasteresult { - background-color: #1F2833; - color: #fff; - padding: 4px 12px; - clear: both; - -moz-box-shadow: inset 0 2px 2px #000; - -webkit-box-shadow: inset 0 2px 2px #000; - box-shadow: inset 0 2px 2px #000; -} - -#pasteresult a { color: #fff; } - -#pasteresult button { margin-left: 11px; } - -#deletelink { float: right; } - -#toolbar, #status { margin-bottom: 5px; } - -#copyhint { color: #666; font-size: 0.85em } - -button, .button { - color: #fff; - background-color: #323b47; - background-repeat: no-repeat; - background-position: center left; - padding: 4px 8px; - font-size: 1em; - margin-right: 5px; - display: inline-block; - background-image: linear-gradient(bottom, #323b47 0, #51606e 100%); - background-image: -o-linear-gradient(bottom, #323b47 0, #51606e 100%); - background-image: -moz-linear-gradient(bottom, #323b47 0, #51606e 100%); - background-image: -webkit-linear-gradient(bottom, #323b47 0, #51606e 100%); - background-image: -ms-linear-gradient(bottom, #323b47 0, #51606e 100%); - background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #323b47), color-stop(1, #51606e)); - border: 1px solid #28343F; - -moz-box-shadow: inset 0 1px 2px #647384; - -webkit-box-shadow: inset 0 1px 2px #647384; - box-shadow: inset 0 1px 2px #647384; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - -moz-background-clip: padding; - -webkit-background-clip: padding-box; - background-clip: padding-box; -} - -button:hover { - background-image: linear-gradient(bottom, #424b57 0%, #61707e 100%); - background-image: -o-linear-gradient(bottom, #424b57 0%, #61707e 100%); - background-image: -moz-linear-gradient(bottom, #424b57 0%, #61707e 100%); - background-image: -webkit-linear-gradient(bottom, #424b57 0%, #61707e 100%); - background-image: -ms-linear-gradient(bottom, #424b57 0%, #61707e 100%); - background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #424b57), color-stop(1, #61707e)); -} - -button:active { - background-image: linear-gradient(bottom, #51606e 0, #323b47 100%); - background-image: -o-linear-gradient(bottom, #51606e 0, #323b47 100%); - background-image: -moz-linear-gradient(bottom, #51606e 0, #323b47 100%); - background-image: -webkit-linear-gradient(bottom, #51606e 0, #323b47 100%); - background-image: -ms-linear-gradient(bottom, #51606e 0, #323b47 100%); - background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #51606e), color-stop(1, #323b47)); - position:relative; - top:1px; -} - -button:disabled, .buttondisabled { - background: #ccc; - color: #888; - top: 0; -} - -button img { - margin-right: 8px; - position: relative; - top: 2px; -} - -.button { - background-color: #414d5a; - padding: 6px 8px; - margin: 0 5px 0 0; - position: relative; - bottom: 1px; /* WTF ? Why is this shifted by 1 pixel ? */ -} - -.button select { - color: #eee; - background: transparent; - border: none; -} - - -.button select option { - color:#eee; - background: #414d5a; -} - -#rawtextbutton img { - padding: 1px 0 1px 0; -} - -#remainingtime, #password { - color: #94a3b4; - display: inline; - font-size: 0.85em; -} - -#newbutton { - float: right; - margin-right: 0; - margin-bottom: 5px; - display: inline; -} - -input { - color: #777; - font-size: 1em; - padding: 6px; - border: 1px solid #28343f; -} - -.blink { - text-decoration: blink; - font-size: 0.8em; - color: #a4b3c4; -} - -.foryoureyesonly { - color: #ff0 !important; - font-size: 1em !important; - font-weight: bold !important; -} - -#attachmentPreview, .nonworking { - background-color: #fff; - color: #000; - width: 100%; - text-align: center; - font-weight: bold; - font-size: 10pt; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - padding: 5px 0; -} - -.hidden { display: none !important; } - -#ienotice { - background-color: #7e98af; - color: #000; - font-size: 0.85em; - padding: 3px 5px; - text-align: center; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - display: none; -} - -#ienotice a { color: #000; } - -#oldienotice { display: none; } - -.errorMessage { - background-color: #f77 !important; - color:#ff0; -} - -.small { - font-size: 80%; -} - -/* --- discussion related CSS ------- */ - -#discussion { /* Discussion container */ - margin-top: 20px; - width: 100%; - margin-left: -30px; - min-width: 200px; -} - -h4.title { - font-size: 1.2em; - color: #94a3b4; - font-style: italic; - font-weight: bold; - position: relative; - margin-left: 30px; -} - -.comment /* One single reply */ -{ - background-color: #ceced6; - color: #000; - white-space: pre-wrap; - font-family: Consolas,"Lucida Console","DejaVu Sans Mono",Monaco,monospace; - font-size: 9pt; - border-left: 1px solid #859AAE; - border-top: 1px solid #859AAE; - padding: 5px 0px 5px 5px; - margin-left: 30px; - -moz-box-shadow: -3px -3px 5px rgba(0,0,0,0.15); - -webkit-box-shadow: -3px -3px 5px rgba(0,0,0,0.15); - box-shadow: -3px -3px 5px rgba(0,0,0,0.15); - min-width: 200px; - overflow: auto; -} - -.reply { margin: 5px 0 0 30px; } - -#replystatus { - display: inline; - padding: 1px 7px; - font-family: Arial, Helvetica, sans-serif; -} - -.comment button { - color: #446; - background-color: #aab; - background-repeat: no-repeat; - background-position: center left; - padding: 0 2px; - font-size: 0.73em; - margin: 3px 5px 3px 0; - display: inline; - background-image: linear-gradient(bottom, #aab 0, #ccc 100%); - background-image: -o-linear-gradient(bottom, #aab 0, #ccc 100%); - background-image: -moz-linear-gradient(bottom, #aab 0, #ccc 100%); - background-image: -webkit-linear-gradient(bottom, #aab 0, #ccc 100%); - background-image: -ms-linear-gradient(bottom, #aab 0, #ccc 100%); - background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #aab), color-stop(1, #ccc)); - border: 1px solid #ccd; - -moz-box-shadow: inset 0 1px 2px #ddd; - -webkit-box-shadow: inset 0 1px 2px #fff; - box-shadow: inset 0 1px 2px #eee; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - -moz-background-clip: padding; - -webkit-background-clip: padding-box; - background-clip: padding-box; -} - -.comment button:hover { - background-image: linear-gradient(bottom, #ccd 0, #fff 100%); - background-image: -o-linear-gradient(bottom, #ccd 0, #fff 100%); - background-image: -moz-linear-gradient(bottom, #ccd 0, #fff 100%); - background-image: -webkit-linear-gradient(bottom, #ccd 0, #fff 100%); - background-image: -ms-linear-gradient(bottom, #ccd 0, #fff 100%); - background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #ccd), color-stop(1, #fff)); -} - -.comment button:active { - background-image: linear-gradient(bottom, #fff 0, #889 100%); - background-image: -o-linear-gradient(bottom, #fff 0, #889 100%); - background-image: -moz-linear-gradient(bottom, #fff 0, #889 100%); - background-image: -webkit-linear-gradient(bottom, #fff 0, #889 100%); - background-image: -ms-linear-gradient(bottom, #fff 0, #889 100%); - background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #fff), color-stop(1, #889)); - position:relative; - top:1px; -} - -.comment input { padding: 2px; } - -#replymessage { margin-top: 5px; } - -.commentmeta { - color: #fff; - background-color: #8ea0b2; - margin-bottom: 3px; - padding: 0 0 0 3px; -} - -.commentdate { color: #bfcede; } - -img.vizhash { - width: 16px; - height: 16px; - position: relative; - top: 2px; - left: -3px; -} - -#prettyprint { - color: #000000; - font-size: 1.2em; -} - -#prettyprint.prettyprinted { - overflow: auto; -} - -#cleartext { - padding: 10px; -} - -#cleartext * { - margin-bottom: 10px; -} - -#cleartext ol { - list-style: auto; - margin-left: 15px; -} - -#cleartext ul { - list-style: disc; - margin-left: 15px; -} - -#cleartext h1, #cleartext h2, #cleartext h3, #cleartext h4, #cleartext h5, #cleartext h6 { - font-weight: bold; -} - -#cleartext h1 { - font-size: 2em; -} - -#cleartext h2 { - font-size: 1.5em; -} - -#cleartext h3 { - font-size: 1.2em; -} diff --git a/i18n/de.json b/i18n/de.json deleted file mode 100644 index b93303f7..00000000 --- a/i18n/de.json +++ /dev/null @@ -1,159 +0,0 @@ -{ - "PrivateBin": "PrivateBin", - "%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted in the browser using 256 bits AES. More information on the project page.": - "%s ist ein minimalistischer, quelloffener \"Pastebin\"-artiger Dienst, bei dem der Server keinerlei Kenntnis der Inhalte hat. Die Daten werden im Browser mit 256 Bit AES ver- und entschlüsselt. Weitere Informationen sind auf der Projektseite zu finden.", - "Because ignorance is bliss": - "Unwissenheit ist ein Segen", - "en": "de", - "Paste does not exist, has expired or has been deleted.": - "Diesen Text gibt es nicht, er ist abgelaufen oder wurde gelöscht.", - "%s requires php %s or above to work. Sorry.": - "%s benötigt PHP %s oder höher, um zu funktionieren. Sorry.", - "%s requires configuration section [%s] to be present in configuration file.": - "%s benötigt den Konfigurationsabschnitt [%s] in der Konfigurationsdatei um zu funktionieren.", - "Please wait %d seconds between each post.": - "Bitte warte %d Sekunden zwischen dem Absenden.", - "Paste is limited to %s of encrypted data.": - "Texte sind auf %s verschlüsselte Datenmenge beschränkt.", - "Invalid data.": - "Ungültige Daten.", - "You are unlucky. Try again.": - "Du hast Pech. Versuchs nochmal.", - "Error saving comment. Sorry.": - "Fehler beim Speichern des Kommentars. Sorry.", - "Error saving paste. Sorry.": - "Fehler beim Speichern des Textes. Sorry.", - "Invalid paste ID.": - "Ungültige Text-ID.", - "Paste is not of burn-after-reading type.": - "Text ist kein \"Einmal\"-Typ.", - "Wrong deletion token. Paste was not deleted.": - "Falscher Lösch-Code. Text wurde nicht gelöscht.", - "Paste was properly deleted.": - "Text wurde erfolgreich gelöscht.", - "JavaScript is required for %s to work.
Sorry for the inconvenience.": - "JavaScript ist eine Voraussetzung, um %s zu nutzen.
Bitte entschuldige die Unannehmlichkeiten.", - "%s requires a modern browser to work.": - "%s setzt einen modernen Browser voraus, um funktionieren zu können.", - "Still using Internet Explorer? Do yourself a favor, switch to a modern browser:": - "Du benutzt immer noch den Internet Explorer? Tu Dir einen Gefallen und wechsle zu einem moderneren Browser:", - "New": - "Neu", - "Send": - "Senden", - "Clone": - "Klonen", - "Raw text": - "Reiner Text", - "Expires": - "Ablaufzeit", - "Burn after reading": - "Einmal-Text", - "Open discussion": - "Diskussion eröffnen", - "Password (recommended)": - "Passwort (empfohlen)", - "Discussion": - "Diskussion", - "Toggle navigation": - "Navigation umschalten", - "%d seconds": ["%d Sekunde", "%d Sekunden"], - "%d minutes": ["%d Minute", "%d Minuten"], - "%d hours": ["%d Stunde", "%d Stunden"], - "%d days": ["%d Tag", "%d Tage"], - "%d weeks": ["%d Woche", "%d Wochen"], - "%d months": ["%d Monat", "%d Monate"], - "%d years": ["%d Jahr", "%d Jahre"], - "Never": - "Nie", - "Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": - "Hinweis: Dies ist ein Versuchsdienst. Daten können jederzeit gelöscht werden. Kätzchen werden sterben wenn du diesen Dienst missbrauchst.", - "This document will expire in %d seconds.": - ["Dieses Dokument läuft in einer Sekunde ab.", "Dieses Dokument läuft in %d Sekunden ab."], - "This document will expire in %d minutes.": - ["Dieses Dokument läuft in einer Minute ab.", "Dieses Dokument läuft in %d Minuten ab."], - "This document will expire in %d hours.": - ["Dieses Dokument läuft in einer Stunde ab.", "Dieses Dokument läuft in %d Stunden ab."], - "This document will expire in %d days.": - ["Dieses Dokument läuft in einem Tag ab.", "Dieses Dokument läuft in %d Tagen ab."], - "This document will expire in %d months.": - ["Dieses Dokument läuft in einem Monat ab.", "Dieses Dokument läuft in %d Monaten ab."], - "Please enter the password for this paste:": - "Bitte gib das Passwort für diesen Text ein:", - "Could not decrypt data (Wrong key?)": - "Konnte Daten nicht entschlüsseln (Falscher Schlüssel?)", - "Could not delete the paste, it was not stored in burn after reading mode.": - "Konnte das Paste nicht löschen, es wurde nicht im Einmal-Modus gespeichert.", - "FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": - "DIESER TEXT IST NUR FÜR DICH GEDACHT. Schließe das Fenster nicht, diese Nachricht kann nur einmal geöffnet werden.", - "Could not decrypt comment; Wrong key?": - "Konnte Kommentar nicht entschlüsseln; Falscher Schlüssel?", - "Reply": - "Antworten", - "Anonymous": - "Anonym", - "Avatar generated from IP address": - "Avatar (generiert aus der IP-Adresse)", - "Add comment": - "Kommentar hinzufügen", - "Optional nickname…": - "Optionales Pseudonym…", - "Post comment": - "Kommentar absenden", - "Sending comment…": - "Sende Kommentar…", - "Comment posted.": - "Kommentar gesendet.", - "Could not refresh display: %s": - "Konnte Ansicht nicht aktualisieren: %s", - "unknown status": - "Unbekannter Grund", - "server error or not responding": - "Fehler auf dem Server oder keine Antwort vom Server", - "Could not post comment: %s": - "Konnte Kommentar nicht senden: %s", - "Please move your mouse for more entropy…": - "Bitte bewege Deine Maus um die Entropie zu erhöhen…", - "Sending paste…": - "Sende Paste…", - "Your paste is %s (Hit [Ctrl]+[c] to copy)": - "Dein Paste ist unter %s zu finden (Drücke [Strg]+[c] um den Link zu kopieren)", - "Delete data": - "Lösche Daten", - "Could not create paste: %s": - "Konnte Paste nicht erstellen: %s", - "Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": - "Konnte Paste nicht entschlüsseln: Der Schlüssel fehlt in der Adresse (Hast du eine Umleitung oder einen URL-Verkürzer benutzt, der Teile der Adresse entfernt?)", - "Format": "Format", - "Plain Text": "Nur Text", - "Source Code": "Quellcode", - "Markdown": "Markdown", - "Download attachment": "Anhang herunterladen", - "Cloned: '%s'": "Geklont: '%s'", - "The cloned file '%s' was attached to this paste.": "Die geklonte Datei '%s' wurde angehängt.", - "Attach a file": "Datei anhängen", - "alternatively drag & drop a file or paste an image from the clipboard": "Alternativ Drag & Drop einer Datei oder einfügen eines Bildes aus der Zwischenablage", - "File too large, to display a preview. Please download the attachment.": "Datei zu groß, um als Vorschau angezeigt zu werden. Bitte Anhang herunterladen.", - "Remove attachment": "Anhang entfernen", - "Your browser does not support uploading encrypted files. Please use a newer browser.": - "Dein Browser unterstützt das hochladen von verschlüsselten Dateien nicht. Bitte verwende einen neueren Browser.", - "Invalid attachment.": "Ungültiger Datei-Anhang.", - "Options": "Optionen", - "Shorten URL": "URL verkürzen", - "Editor": "Bearbeiten", - "Preview": "Vorschau", - "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": - "Der PATH muss bei %s mit einem \"%s\" enden. Bitte passe Deinen PATH in Deiner index.php an.", - "Decrypt": - "Entschlüsseln", - "Enter password": - "Passwort eingeben", - "Loading…": "Lädt…", - "Decrypting paste…": "Entschlüssle Paste…", - "Preparing new paste…": "Bereite neues Paste vor…", - "In case this message never disappears please have a look at this FAQ for information to troubleshoot.": - "Wenn diese Nachricht nicht mehr verschwindet, schau bitte in die FAQ (englisch), um zu sehen, wie der Fehler behoben werden kann.", - "+++ no paste text +++": "+++ kein Paste-Text +++", - "Could not get paste data: %s": - "Konnte Paste nicht laden: %s" -} \ No newline at end of file diff --git a/i18n/es.json b/i18n/es.json deleted file mode 100644 index ec4fe804..00000000 --- a/i18n/es.json +++ /dev/null @@ -1,159 +0,0 @@ -{ - "PrivateBin": "PrivateBin", - "%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted in the browser using 256 bits AES. More information on the project page.": - "%s es un servicio de tipo \"Pastebin\" minimalista de código abierto, donde el servidor no tiene ningún conocimiento de los datos guardados. Los datos son cifrados/descifrados en el navegador usando 256 bits AES. Más información en la página del proyecto.", - "Because ignorance is bliss": - "Porque la ignorancia es dicha", - "en": "es", - "Paste does not exist, has expired or has been deleted.": - "El texto no existe, ha caducado o ha sido eliminado.", - "%s requires php %s or above to work. Sorry.": - "%s requiere php %s o superior para funcionar. Lo siento.", - "%s requires configuration section [%s] to be present in configuration file.": - "%s requiere que la sección de configuración [%s] esté presente en el archivo de configuración.", - "Please wait %d seconds between each post.": - "Por favor espere %d segundos entre cada publicación.", - "Paste is limited to %s of encrypted data.": - "El texto está limitado a %s de datos cifrados.", - "Invalid data.": - "Datos inválidos.", - "You are unlucky. Try again.": - "Tienes mala suerte. Inténtalo de nuevo", - "Error saving comment. Sorry.": - "Error al guardar el comentario. Lo siento.", - "Error saving paste. Sorry.": - "Error al guardar el texto. Lo siento", - "Invalid paste ID.": - "ID del texto inválido.", - "Paste is not of burn-after-reading type.": - "El texto no es del tipo \"destruir despues de leer\".", - "Wrong deletion token. Paste was not deleted.": - "Token de eliminación erróneo. El texto no fue eliminado.", - "Paste was properly deleted.": - "El texto se ha eliminado correctamente.", - "JavaScript is required for %s to work.
Sorry for the inconvenience.": - "JavaScript es necesario para que %s funcione.
Sentimos los inconvenientes ocasionados.", - "%s requires a modern browser to work.": - "%s requiere un navegador moderno para funcionar.", - "Still using Internet Explorer? Do yourself a favor, switch to a modern browser:": - "¿Sigues usando Internet Explorer? Hazte un favor, cambia a un navegador moderno:", - "New": - "Nuevo", - "Send": - "Enviar", - "Clone": - "Clonar", - "Raw text": - "Texto sin formato", - "Expires": - "Caducar en", - "Burn after reading": - "Destruir después de leer", - "Open discussion": - "Discusión abierta", - "Password (recommended)": - "Contraseña (recomendado)", - "Discussion": - "Discusión", - "Toggle navigation": - "Cambiar navegación", - "%d seconds": ["%d segundo", "%d segundos"], - "%d minutes": ["%d minuto", "%d minutos"], - "%d hours": ["%d hora", "%d horas"], - "%d days": ["%d día", "%d días"], - "%d weeks": ["%d semana", "%d semanas"], - "%d months": ["%d mes", "%d meses"], - "%d years": ["%d año", "%d años"], - "Never": - "Nunca", - "Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": - "Nota: Este es un servicio de prueba. Los datos pueden ser eliminados en cualquier momento. Gatitos morirán si se abusa de este servicio.", - "This document will expire in %d seconds.": - ["Este documento caducará en un segundo.", "Este documento caducará en %d segundos."], - "This document will expire in %d minutes.": - ["Este documento caducará en un minuto.", "Este documento caducará en %d minutos."], - "This document will expire in %d hours.": - ["Este documento caducará en una hora.", "Este documento caducará en %d horas."], - "This document will expire in %d days.": - ["Este documento caducará en un día.", "Este documento caducará en %d días."], - "This document will expire in %d months.": - ["Este documento caducará en un mes.", "Este documento caducará en %d meses."], - "Please enter the password for this paste:": - "Por favor ingrese la contraseña para este documento:", - "Could not decrypt data (Wrong key?)": - "No fue posible descifrar los datos (¿Clave errónea?)", - "Could not delete the paste, it was not stored in burn after reading mode.": - "No fue posible eliminar el documento, no fue guardado en modo \"destruir despues de leer\".", - "FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": - "SÓLO PARA TUS OJOS. No cierre esta ventana, este mensaje no se puede volver a mostrar.", - "Could not decrypt comment; Wrong key?": - "No se pudo descifrar el comentario; ¿Llave incorrecta?", - "Reply": - "Responder", - "Anonymous": - "Anónimo", - "Avatar generated from IP address": - "Avatar generado a partir de la dirección IP", - "Add comment": - "Añadir comentario", - "Optional nickname…": - "Seudónimo opcional…", - "Post comment": - "Publicar comentario", - "Sending comment…": - "Enviando comentario…", - "Comment posted.": - "Comentario publicado.", - "Could not refresh display: %s": - "No se pudo actualizar la vista: %s", - "unknown status": - "Estado desconocido", - "server error or not responding": - "Error del servidor o el servidor no responde", - "Could not post comment: %s": - "No fue posible publicar comentario: %s", - "Please move your mouse for more entropy…": - "Por favor, mueva el ratón para mayor entropía…", - "Sending paste…": - "Enviando texto…", - "Your paste is %s (Hit [Ctrl]+[c] to copy)": - "Su texto está en %s (Presione [Ctrl]+[c] para copiar)", - "Delete data": - "Eliminar datos", - "Could not create paste: %s": - "No fue posible crear el archivo: %s", - "Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": - "No es posible descifrar el documento: Falta la clave de descifrado en la URL (¿Utilizó un redirector o un acortador de URL que quite parte de la URL?)", - "Format": "Formato", - "Plain Text": "Texto sin formato", - "Source Code": "Código fuente", - "Markdown": "Markdown", - "Download attachment": "Descargar adjunto", - "Cloned: '%s'": "Clonado: '%s'.", - "The cloned file '%s' was attached to this paste.": "El archivo clonado '%s' ha sido adjuntado a este texto.", - "Attach a file": "Adjuntar archivo", - "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", - "File too large, to display a preview. Please download the attachment.": "File too large, to display a preview. Please download the attachment.", - "Remove attachment": "Remover adjunto", - "Your browser does not support uploading encrypted files. Please use a newer browser.": - "Tu navegador no admite la carga de archivos cifrados. Utilice un navegador más reciente.", - "Invalid attachment.": "Adjunto inválido.", - "Options": "Opciones", - "Shorten URL": "Acortar URL", - "Editor": "Editor", - "Preview": "Previsualización", - "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": - "%s requiere que el PATH termine en \"%s\". Por favor, actualice el PATH en su index.php.", - "Decrypt": - "Descifrar", - "Enter password": - "Ingrese contraseña", - "Loading…": "Cargando…", - "Decrypting paste…": "Descifrando texto…", - "Preparing new paste…": "Preparando texto nuevo…", - "In case this message never disappears please have a look at this FAQ for information to troubleshoot.": - "En caso de que este mensaje nunca desaparezca por favor revise este FAQ para obtener información para solucionar problemas.", - "+++ no paste text +++": "+++ sin texto +++", - "Could not get paste data: %s": - "Could not get paste data: %s" -} \ No newline at end of file diff --git a/i18n/fr.json b/i18n/fr.json deleted file mode 100644 index 61171437..00000000 --- a/i18n/fr.json +++ /dev/null @@ -1,168 +0,0 @@ -{ - "PrivateBin": "PrivateBin", - "%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted in the browser using 256 bits AES. More information on the project page.": - "%s est un 'pastebin' (ou gestionnaire d'extraits de texte et de code source) minimaliste et open source, dans lequel le serveur n'a aucune connaissance des données envoyées. Les données sont chiffrées/déchiffrées dans le navigateur par un chiffrement AES 256 bits. Plus d'informations sur la page du projet.", - "Because ignorance is bliss": - "Parce que l'ignorance c'est le bonheur", - "en": "fr", - "Paste does not exist, has expired or has been deleted.": - "Le paste n'existe pas, a expiré, ou a été supprimé.", - "%s requires php %s or above to work. Sorry.": - "Désolé, %s nécessite php %s ou supérieur pour fonctionner.", - "%s requires configuration section [%s] to be present in configuration file.": - "%s a besoin de la section de configuration [%s] dans le fichier de configuration pour fonctionner.", - "Please wait %d seconds between each post.": - "Merci d'attendre %d secondes entre chaque publication.", - "Paste is limited to %s of encrypted data.": - "Le paste est limité à %s de données chiffrées.", - "Invalid data.": - "Données invalides.", - "You are unlucky. Try again.": - "Pas de chance. Essayez encore.", - "Error saving comment. Sorry.": - "Erreur lors de la sauvegarde du commentaire.", - "Error saving paste. Sorry.": - "Erreur lors de la sauvegarde du paste. Désolé.", - "Invalid paste ID.": - "ID du paste invalide.", - "Paste is not of burn-after-reading type.": - "Le paste n'est pas de type \"Effacer après lecture\".", - "Wrong deletion token. Paste was not deleted.": - "Jeton de suppression incorrect. Le paste n'a pas été supprimé.", - "Paste was properly deleted.": - "Le paste a été correctement supprimé.", - "JavaScript is required for %s to work.
Sorry for the inconvenience.": - "JavaScript est requis pour faire fonctionner %s.
Désolé pour cet inconvénient.", - "%s requires a modern browser to work.": - "%s nécessite un navigateur moderne pour fonctionner.", - "Still using Internet Explorer? Do yourself a favor, switch to a modern browser:": - "Encore sur Internet Explorer ? Faites-vous une faveur, passez à un navigateur moderne :", - "New": - "Nouveau", - "Send": - "Envoyer", - "Clone": - "Cloner", - "Raw text": - "Texte brut", - "Expires": - "Expire", - "Burn after reading": - "Effacer après lecture", - "Open discussion": - "Autoriser la discussion", - "Password (recommended)": - "Mot de passe (recommandé)", - "Discussion": - "Discussion", - "Toggle navigation": - "Basculer la navigation", - "%d seconds": ["%d seconde", "%d secondes"], - "%d minutes": ["%d minute", "%d minutes"], - "%d hours": ["%d heure", "%d heures"], - "%d days": ["%d jour", "%d jours"], - "%d weeks": ["%d semaine", "%d semaines"], - "%d months": ["%d mois", "%d mois"], - "%d years": ["%d an", "%d ans"], - "Never": - "Jamais", - "Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": - "Note : Ceci est un service de test : les données peuvent être supprimées à tout moment. Des chatons mourront si vous utilisez ce service de manière abusive.", - "This document will expire in %d seconds.": - ["Ce document expirera dans %d seconde.", "Ce document expirera dans %d secondes."], - "This document will expire in %d minutes.": - ["Ce document expirera dans %d minute.", "Ce document expirera dans %d minutes."], - "This document will expire in %d hours.": - ["Ce document expirera dans %d heure.", "Ce document expirera dans %d heures."], - "This document will expire in %d days.": - ["Ce document expirera dans %d jour.", "Ce document expirera dans %d jours."], - "This document will expire in %d months.": - ["Ce document expirera dans %d mois.", "Ce document expirera dans %d mois."], - "Please enter the password for this paste:": - "Entrez le mot de passe pour ce paste:", - "Could not decrypt data (Wrong key?)": - "Impossible de déchiffrer les données (mauvaise clé ?)", - "Could not delete the paste, it was not stored in burn after reading mode.": - "Impossible de supprimer le paste, car il n'a pas été stocké en mode \"Effacer après lecture\".", - "FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": - "POUR VOS YEUX UNIQUEMENT. Ne fermez pas cette fenêtre, ce paste ne pourra plus être affiché.", - "Could not decrypt comment; Wrong key?": - "Impossible de déchiffrer le commentaire ; mauvaise clé ?", - "Reply": - "Répondre", - "Anonymous": - "Anonyme", - "Avatar generated from IP address": - "Avatar généré à partir de l'adresse IP", - "Add comment": - "Ajouter un commentaire", - "Optional nickname…": - "Pseudonyme optionnel…", - "Post comment": - "Poster le commentaire", - "Sending comment…": - "Envoi du commentaire…", - "Comment posted.": - "Commentaire posté.", - "Could not refresh display: %s": - "Impossible de rafraichir l'affichage : %s", - "unknown status": - "Statut inconnu", - "server error or not responding": - "Le serveur ne répond pas ou a rencontré une erreur", - "Could not post comment: %s": - "Impossible de poster le commentaire : %s", - "Please move your mouse for more entropy…": - "Merci de bouger votre souris pour plus d'entropie…", - "Sending paste…": - "Envoi du paste…", - "Your paste is %s (Hit [Ctrl]+[c] to copy)": - "Votre paste est disponible à l'adresse %s (Appuyez sur [Ctrl]+[c] pour copier)", - "Delete data": - "Supprimer les données du paste", - "Could not create paste: %s": - "Impossible de créer le paste : %s", - "Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": - "Impossible de déchiffrer le paste : Clé de déchiffrement manquante dans l'URL (Avez-vous utilisé un redirecteur ou un site de réduction d'URL qui supprime une partie de l'URL ?)", - "B": "o", - "KiB": "Kio", - "MiB": "Mio", - "GiB": "Gio", - "TiB": "Tio", - "PiB": "Pio", - "EiB": "Eio", - "ZiB": "Zio", - "YiB": "Yio", - "Format": "Format", - "Plain Text": "Texte brut", - "Source Code": "Code source", - "Markdown": "Markdown", - "Download attachment": "Télécharger la pièce jointe", - "Cloned: '%s'": "Cloner '%s'", - "The cloned file '%s' was attached to this paste.": "Le fichier cloné '%s' a été attaché à ce paste.", - "Attach a file": "Attacher un fichier ", - "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", - "File too large, to display a preview. Please download the attachment.": "File too large, to display a preview. Please download the attachment.", - "Remove attachment": "Enlever l'attachement", - "Your browser does not support uploading encrypted files. Please use a newer browser.": - "Votre navigateur ne supporte pas l'envoi de fichiers chiffrés. Merci d'utiliser un navigateur plus récent.", - "Invalid attachment.": "Attachement invalide.", - "Options": "Options", - "Shorten URL": "Raccourcir URL", - "Editor": "Éditer", - "Preview": "Prévisualiser", - "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": - "%s requiert que le PATH se termine dans un \"%s\". Veuillez mettre à jour le PATH dans votre index.php.", - "Decrypt": - "Déchiffrer", - "Enter password": - "Entrez le mot de passe", - "Loading…": "Chargement…", - "Decrypting paste…": "Déchiffrement du paste…", - "Preparing new paste…": "Préparation du paste…", - "In case this message never disappears please have a look at this FAQ for information to troubleshoot.": - "Si ce message ne disparaîssait pas, jetez un oeil à cette FAQ pour des idées de résolution (en Anglais).", - "+++ no paste text +++": "+++ pas de paste-text +++", - "Could not get paste data: %s": - "Could not get paste data: %s" -} \ No newline at end of file diff --git a/i18n/hu.json b/i18n/hu.json deleted file mode 100644 index 23a43bc1..00000000 --- a/i18n/hu.json +++ /dev/null @@ -1,159 +0,0 @@ -{ - "PrivateBin": "PrivateBin", - "%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted in the browser using 256 bits AES. More information on the project page.": - "A %s egy minimalista, nyílt forráskódú adattároló szoftver, ahol a szerver semmilyen információt nem tárol a feltett adatról. Azt ugyanis a böngésződ segítségével titkosítja és oldja fel 256 bit hosszú titkosítási kulcsú AES-t használva. További információt a projekt oldalán találsz.", - "Because ignorance is bliss": - "A titok egyfajta hatalom.", - "en": "hu", - "Paste does not exist, has expired or has been deleted.": - "A bejegyzés nem létezik, lejárt vagy törölve lett.", - "%s requires php %s or above to work. Sorry.": - "Bocs, de a %s működéséhez %s vagy ezt meghaladó verziójú php-s környezet szükséges.", - "%s requires configuration section [%s] to be present in configuration file.": - "A %s megfelelő működéséhez a konfigurációs fájlban a [%s] résznek léteznie kell.", - "Please wait %d seconds between each post.": - "Kérlek várj %d másodpercet két beküldés között.", - "Paste is limited to %s of encrypted data.": - "A bejegyzés maximális hossza: %s", - "Invalid data.": - "Érvénytelen adat.", - "You are unlucky. Try again.": - "Peched volt, próbáld újra.", - "Error saving comment. Sorry.": - "Nem sikerült menteni a hozzászólást. Bocs.", - "Error saving paste. Sorry.": - "Nem sikerült menteni a bejegyzést. Bocs.", - "Invalid paste ID.": - "Érvénytelen bejegyzés azonosító.", - "Paste is not of burn-after-reading type.": - "A bejegyzés nem semmisül meg azonnal olvasás után.", - "Wrong deletion token. Paste was not deleted.": - "Hibás törlési azonosító. A bejegyzés nem lett törölve.", - "Paste was properly deleted.": - "A bejegyzés sikeresen törölve.", - "JavaScript is required for %s to work.
Sorry for the inconvenience.": - "JavaScript szükséges a %s működéséhez. Elnézést a fennakadásért.", - "%s requires a modern browser to work.": - "A %s működéséhez a jelenleginél újabb böngészőre van szükség.", - "Still using Internet Explorer? Do yourself a favor, switch to a modern browser:": - "Még mindig Internet Explorert használsz? Ideje váltani:", - "New": - "Új", - "Send": - "Beküldöm!", - "Clone": - "Másol", - "Raw text": - "A nyers szöveg", - "Expires": - "Lejárati idő", - "Burn after reading": - "Törlés az első olvasás után", - "Open discussion": - "Hozzászólások engedélyezése", - "Password (recommended)": - "Jelszó (ajánlott)", - "Discussion": - "Hozzászólások", - "Toggle navigation": - "Navigáció", - "%d seconds": ["%d másodperc", "%d másodperc"], - "%d minutes": ["%d perc", "%d perc"], - "%d hours": ["%d óra", "%d óra"], - "%d days": ["%d nap", "%d nap"], - "%d weeks": ["%d hét", "%d hét"], - "%d months": ["%d hónap", "%d hónap"], - "%d years": ["%d év", "%d év"], - "Never": - "Soha", - "Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": - "Megjegyzés: ez egy teszt szolgáltatás, az adatok bármikor törlődhetnek. Ha visszaélsz vele, kiscicák bánhatják! :)", - "This document will expire in %d seconds.": - ["Ez a bejegyzés %d másodperc után megsemmisül.", "Ez a bejegyzés %d másodperc múlva megsemmisül."], - "This document will expire in %d minutes.": - ["Ez a bejegyzés %d perc után megsemmisül.", "Ez a bejegyzés %d perc múlva megsemmisül."], - "This document will expire in %d hours.": - ["Ez a bejegyzés %d óra után megsemmisül.", "Ez a bejegyzés %d óra múlva megsemmisül."], - "This document will expire in %d days.": - ["Ez a bejegyzés %d nap után megsemmisül.", "Ez a bejegyzés %d nap múlva megsemmisül."], - "This document will expire in %d months.": - ["Ez a bejegyzés %d hónap múlva megsemmisül.", "Ez a bejegyzés %d hónap múlva megsemmisül."], - "Please enter the password for this paste:": - "Add meg a szükséges jelszót a bejegyzés megtekintéséhez:", - "Could not decrypt data (Wrong key?)": - "Nem tudtuk dekódolni az adatot. Talán rossz kulcsot adtál meg?", - "Could not delete the paste, it was not stored in burn after reading mode.": - "Nem tudtuk törölni a bejegyzést, mivel az olvasás után egyből megsemmisült. Így nem is volt tárolva.", - "FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": - "EZT A BEJEGYZÉST CSAK TE LÁTHATOD!!! Ne csukd be ezt az ablakot, mivel nem tudod újra megnézni. Az ugyanis az első olvasás után rögtön megsemmisül.", - "Could not decrypt comment; Wrong key?": - "Nem tudtuk dekódolni a hozzászólást. Talán rossz kulcsot adtál meg?", - "Reply": - "Válasz", - "Anonymous": - "Anonymous", - "Avatar generated from IP address": - "Avatar (az IP cím alapján generáljuk)", - "Add comment": - "Hozzászólok", - "Optional nickname…": - "Becenév (már ha meg akarod adni)", - "Post comment": - "Beküld", - "Sending comment…": - "Beküldés alatt...", - "Comment posted.": - "A hozzászólás beküldve.", - "Could not refresh display: %s": - "Nem tudtuk frissíteni: %s", - "unknown status": - "Ismeretlen státusz.", - "server error or not responding": - "A szerveren hiba lépett fel vagy nem válaszol.", - "Could not post comment: %s": - "Nem tudtuk beküldeni a hozzászólást: %s", - "Please move your mouse for more entropy…": - "Nincs elég véletlenszerűség a rendszerben. Mozgasd az egered, hogy növeld az entrópiát.", - "Sending paste…": - "Bejegyzés elküldése...", - "Your paste is %s (Hit [Ctrl]+[c] to copy)": - "A bejegyzésed a %s címen elérhető. [Ctrl]+[c]-vel tudod vágólapra másolni.", - "Delete data": - "Adat törlése", - "Could not create paste: %s": - "Nem tudtuk létrehozni a bejegyzést: %s", - "Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": - "Nem tudjuk dekódolni a bejegyzést: a dekódoláshoz szükséges kulcs hiányzik a címből. Talán URL rövidítőt használtál ami kivágta azt belőle?", - "Format": "Formátum", - "Plain Text": "Egyszerű szöveg", - "Source Code": "Forráskód", - "Markdown": "Markdown", - "Download attachment": "Csatolmány letöltése", - "Cloned: '%s'": "'%s' másolva", - "The cloned file '%s' was attached to this paste.": "A másolt '%s' csatolmányt hozzáadtuk ehhez a bejegyzéshez.", - "Attach a file": "Fájl csatolása", - "alternatively drag & drop a file or paste an image from the clipboard": "vagy húzz ide egy fájlt, netán illessz be egy képet a vágólapról.", - "File too large, to display a preview. Please download the attachment.": "A fájl túl nagy ahhoz, hogy előnézete legyen. Töltsd le, hogy megtekinthesd.", - "Remove attachment": "Csatolmány eltávolítása", - "Your browser does not support uploading encrypted files. Please use a newer browser.": - "A böngésződ nem támogatja titkosított fájlok feltöltését. Használj újabbat.", - "Invalid attachment.": "Érvénytelen csatolmány.", - "Options": "Opciók", - "Shorten URL": "URL rövidítés", - "Editor": "Szerkesztő felület", - "Preview": "Előnézet", - "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": - "%s számára szükséges, hogy a PATH itt végződjön: \"%s\". Kérlek frissítsd a PATH értékét az index.php fájlban.", - "Decrypt": - "Dekódolás", - "Enter password": - "Jelszó", - "Loading…": "Folyamatban...", - "Decrypting paste…": "Bejegyzés dekódolása...", - "Preparing new paste…": "Új bejegyzés előkészítése...", - "In case this message never disappears please have a look at this FAQ for information to troubleshoot.": - "Abban az esetben, ha ez az üzenet mindig látható lenne, látogass el a Gyakran Ismételt Kérdések szekcióba a megoldásához.", - "+++ no paste text +++": "+++ nincs beillesztett szöveg +++", - "Could not get paste data: %s": - "Could not get paste data: %s" -} \ No newline at end of file diff --git a/i18n/it.json b/i18n/it.json deleted file mode 100644 index b87afac9..00000000 --- a/i18n/it.json +++ /dev/null @@ -1,159 +0,0 @@ -{ - "PrivateBin": "PrivateBin", - "%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted in the browser using 256 bits AES. More information on the project page.": - "%s è un sistema di tipo \"Pastebin\" online, open source, minimalista. Il server non possiede alcuna conoscenza (\"Zero Knowledge\") del contenuto dei dati inviati. I dati sono cifrati/decifrati nel Browser con algoritmo AES a 256 Bit. Per ulteriori informazioni, vedi Sito del progetto.", - "Because ignorance is bliss": - "Perché l'ignoranza è una benedizione (Because ignorance is bliss)", - "en": "it", - "Paste does not exist, has expired or has been deleted.": - "Questo messaggio non esiste, è scaduto o è stato cancellato.", - "%s requires php %s or above to work. Sorry.": - "%s richiede php %s o superiore per funzionare. Ci spiace.", - "%s requires configuration section [%s] to be present in configuration file.": - "%s richiede la presenza della sezione [%s] nei file di configurazione.", - "Please wait %d seconds between each post.": - "Attendi per favore %d secondi prima di ciascun invio.", - "Paste is limited to %s of encrypted data.": - "La dimensione del messaggio è limitata a %s di dati cifrati.", - "Invalid data.": - "Dati non validi.", - "You are unlucky. Try again.": - "Ritenta, sarai più fortunato.", - "Error saving comment. Sorry.": - "Errore durante il salvataggio del commento.", - "Error saving paste. Sorry.": - "Errore durante il salvataggio del messaggio.", - "Invalid paste ID.": - "ID-Messaggio non valido.", - "Paste is not of burn-after-reading type.": - "Il messaggio non è di tipo Distruggi-dopo-lettura.", - "Wrong deletion token. Paste was not deleted.": - "Codice cancellazione errato. Il messaggio NON è stato cancellato.", - "Paste was properly deleted.": - "Il messaggio è stato correttamente cancellato.", - "JavaScript is required for %s to work.
Sorry for the inconvenience.": - "%s funziona solo con JavaScript attivo.
Ci dispiace per l'inconveniente.", - "%s requires a modern browser to work.": - "%s richiede un browser moderno e aggiornato per funzionare.", - "Still using Internet Explorer? Do yourself a favor, switch to a modern browser:": - "Usi ancora Internet Explorer? Ti consigliamo di passare ad un browser più sicuro:", - "New": - "Nuovo", - "Send": - "Invia", - "Clone": - "Clona", - "Raw text": - "Testo Raw", - "Expires": - "Scade", - "Burn after reading": - "Distruggi dopo lettura", - "Open discussion": - "Apri discussione", - "Password (recommended)": - "Password (raccomandato)", - "Discussion": - "Discussione", - "Toggle navigation": - "Scambia Navigazione", - "%d seconds": ["%d secondo", "%d secondi"], - "%d minutes": ["%d minuto", "%d minuti"], - "%d hours": ["%d ora", "%d ore"], - "%d days": ["%d giorno", "%d giorni"], - "%d weeks": ["%d settimana", "%d settimane"], - "%d months": ["%d mese", "%d mesi"], - "%d years": ["%d anno", "%d anni"], - "Never": - "Mai", - "Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": - "Nota: questo è un servizio di prova, i messaggi salvati possono essere cancellati in qualsiasi momento. Moriranno dei gattini se abuserai di questo servizio.", - "This document will expire in %d seconds.": - ["Questo documento scadrà tra un secondo.", "Questo documento scadrà in %d secondi."], - "This document will expire in %d minutes.": - ["Questo documento scadrà tra un minuto.", "Questo documento scadrà in %d minuti."], - "This document will expire in %d hours.": - ["Questo documento scadrà tra un'ora.", "Questo documento scadrà in %d ore."], - "This document will expire in %d days.": - ["Questo documento scadrà tra un giorno.", "Questo documento scadrà in %d giorni."], - "This document will expire in %d months.": - ["Questo documento scadrà tra un mese.", "Questo documento scadrà in %d mesi."], - "Please enter the password for this paste:": - "Inserisci la password per questo messaggio:", - "Could not decrypt data (Wrong key?)": - "Non riesco a decifrari i dati (Chiave errata?)", - "Could not delete the paste, it was not stored in burn after reading mode.": - "Non riesco a cancellare il messaggio, non è stato salvato in modalità Distruggi-dopo-lettora.", - "FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": - "FOR YOUR EYES ONLY. Non chiudere questa finestra, il messaggio non può essere visualizzato una seconda volta.", - "Could not decrypt comment; Wrong key?": - "Non riesco a decifrare il commento (Chiave errata?)", - "Reply": - "Rispondi", - "Anonymous": - "Anonimo", - "Avatar generated from IP address": - "Avatar generato dall'indirizzo IP)", - "Add comment": - "Aggiungi un commento", - "Optional nickname…": - "Nickname opzionale…", - "Post comment": - "Invia commento", - "Sending comment…": - "Commento in fase di invio…", - "Comment posted.": - "Commento inviato.", - "Could not refresh display: %s": - "Non riesco ad aggiornare il display: %s", - "unknown status": - "stato sconosciuto", - "server error or not responding": - "errore o mancata risposta dal server", - "Could not post comment: %s": - "Impossibile inviare il commento: %s", - "Please move your mouse for more entropy…": - "Muovi il mouse in modo casuale, per generare maggior entropia…", - "Sending paste…": - "Messaggio in fase di invio…", - "Your paste is %s (Hit [Ctrl]+[c] to copy)": - "Il tuo messaggio è qui: %s (Premi [Ctrl]+[c] (Windows) o [Cmd]+[c] (Mac) per copiare il link)", - "Delete data": - "Cancella i dati", - "Could not create paste: %s": - "Non riesco a creare il messaggio: %s", - "Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": - "Non riesco a decifrare il messaggio: manca la chiave di decifrazione nell'URL (La chiave è parte integrante dell'URL. Per caso hai usato un Redirector o un altro servizio che ha rimosso una parte dell'URL?)", - "Format": "Formato", - "Plain Text": "Solo Testo", - "Source Code": "Codice Sorgente", - "Markdown": "Markdown", - "Download attachment": "Scarica Allegato", - "Cloned: '%s'": "Clonato: '%s'", - "The cloned file '%s' was attached to this paste.": "Il file clonato '%s' era allegato a questo messaggio.", - "Attach a file": "Allega un file", - "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", - "File too large, to display a preview. Please download the attachment.": "File too large, to display a preview. Please download the attachment.", - "Remove attachment": "Rimuovi allegato", - "Your browser does not support uploading encrypted files. Please use a newer browser.": - "Il tuo browser non supporta l'invio di file cifrati. Utilizza un browser più recente.", - "Invalid attachment.": "Allegato non valido.", - "Options": "Opzioni", - "Shorten URL": "Accorcia URL", - "Editor": "Editor", - "Preview": "Preview", - "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": - "%s necessita che PATH termini con \"%s\". Aggiorna la variabile PATH nel tuo index.php.", - "Decrypt": - "Decifra", - "Enter password": - "Inserisci la password", - "Loading…": "Carico…", - "Decrypting paste…": "Decifro il messaggio…", - "Preparing new paste…": "Preparo il nuovo messaggio…", - "In case this message never disappears please have a look at this FAQ for information to troubleshoot.": - "Nel caso questo messaggio non scompaia, controlla questa FAQ per trovare informazioni su come risolvere il problema (in Inglese).", - "+++ no paste text +++": "+++ nessun testo nel messaggio +++", - "Could not get paste data: %s": - "Could not get paste data: %s" -} \ No newline at end of file diff --git a/i18n/languages.json b/i18n/languages.json deleted file mode 100644 index dace6f1e..00000000 --- a/i18n/languages.json +++ /dev/null @@ -1,181 +0,0 @@ -{ - "ab": ["аҧсуа бызшәа", "Abkhaz"], - "aa": ["Afaraf", "Afar"], - "af": ["Afrikaans", "Afrikaans"], - "ak": ["Akan", "Akan"], - "sq": ["Shqip", "Albanian"], - "am": ["አማርኛ", "Amharic"], - "ar": ["العربية", "Arabic"], - "an": ["aragonés", "Aragonese"], - "hy": ["Հայերեն", "Armenian"], - "as": ["অসমীয়া", "Assamese"], - "ac": ["Ástralic", "Australian"], - "av": ["авар мацӀ", "Avaric"], - "ae": ["avesta", "Avestan"], - "ay": ["aymar aru", "Aymara"], - "az": ["azərbaycan dili", "Azerbaijani"], - "bm": ["bamanankan", "Bambara"], - "ba": ["башҡорт теле", "Bashkir"], - "eu": ["euskara", "Basque"], - "be": ["беларуская мова", "Belarusian"], - "bn": ["বাংলা", "Bengali"], - "bh": ["भोजपुरी", "Bihari"], - "bi": ["Bislama", "Bislama"], - "bs": ["bosanski jezik", "Bosnian"], - "br": ["brezhoneg", "Breton"], - "bg": ["български език", "Bulgarian"], - "my": ["ဗမာစာ", "Burmese"], - "ca": ["català", "Catalan"], - "ch": ["Chamoru", "Chamorro"], - "ce": ["нохчийн мотт", "Chechen"], - "ny": ["chiCheŵa", "Chichewa"], - "zh": ["中文", "Chinese"], - "cv": ["чӑваш чӗлхи", "Chuvash"], - "kw": ["Kernewek", "Cornish"], - "co": ["corsu", "Corsican"], - "cr": ["ᓀᐦᐃᔭᐍᐏᐣ", "Cree"], - "hr": ["hrvatski jezik", "Croatian"], - "cs": ["čeština", "Czech"], - "da": ["dansk", "Danish"], - "dv": ["ދިވެހި", "Divehi"], - "nl": ["Nederlands", "Dutch"], - "dz": ["རྫོང་ཁ", "Dzongkha"], - "en": ["English", "English"], - "eo": ["Esperanto", "Esperanto"], - "et": ["eesti", "Estonian"], - "ee": ["Eʋegbe", "Ewe"], - "fo": ["føroyskt", "Faroese"], - "fj": ["vosa Vakaviti", "Fijian"], - "fi": ["suomi", "Finnish"], - "fr": ["français", "French"], - "ff": ["Fulfulde", "Fula"], - "gl": ["galego", "Galician"], - "ka": ["ქართული", "Georgian"], - "de": ["Deutsch", "German"], - "el": ["ελληνικά", "Greek"], - "gn": ["Avañe'ẽ", "Guaraní"], - "gu": ["ગુજરાતી", "Gujarati"], - "ht": ["Kreyòl ayisyen", "Haitian"], - "ha": ["هَوُسَ", "Hausa"], - "he": ["עברית", "Hebrew"], - "hz": ["Otjiherero", "Herero"], - "hi": ["हिन्दी", "Hindi"], - "ho": ["Hiri Motu", "Hiri Motu"], - "hu": ["magyar", "Hungarian"], - "ia": ["Interlingua", "Interlingua"], - "ie": ["Interlingue", "Interlingue"], - "ga": ["Gaeilge", "Irish"], - "ig": ["Asụsụ Igbo", "Igbo"], - "ik": ["Iñupiaq", "Inupiaq"], - "io": ["Ido", "Ido"], - "is": ["Íslenska", "Icelandic"], - "it": ["italiano", "Italian"], - "iu": ["ᐃᓄᒃᑎᑐᑦ", "Inuktitut"], - "ja": ["日本語", "Japanese"], - "jv": ["basa Jawa", "Javanese"], - "kl": ["kalaallisut", "Greenlandic"], - "kn": ["ಕನ್ನಡ", "Kannada"], - "kr": ["Kanuri", "Kanuri"], - "ks": ["कश्मीरी", "Kashmiri"], - "kk": ["қазақ тілі", "Kazakh"], - "km": ["ខ្មែរ", "Khmer"], - "ki": ["Gĩkũyũ", "Kikuyu"], - "rw": ["Ikinyarwanda", "Kinyarwanda"], - "ky": ["Кыргызча", "Kyrgyz"], - "kv": ["коми кыв", "Komi"], - "kg": ["Kikongo", "Kongo"], - "ko": ["한국어", "Korean"], - "ku": ["Kurdî", "Kurdish"], - "kj": ["Kuanyama", "Kwanyama"], - "la": ["lingua latina", "Latin"], - "lb": ["Lëtzebuergesch", "Luxembourgish"], - "lg": ["Luganda", "Ganda"], - "li": ["Limburgs", "Limburgish"], - "ln": ["Lingála", "Lingala"], - "lo": ["ພາສາລາວ", "Lao"], - "lt": ["lietuvių kalba", "Lithuanian"], - "lu": ["Tshiluba", "Luba-Katanga"], - "lv": ["latviešu valoda", "Latvian"], - "gv": ["Gaelg", "Manx"], - "mk": ["македонски јазик", "Macedonian"], - "mg": ["fiteny malagasy", "Malagasy"], - "ms": ["بهاس ملايو‎", "Malay"], - "ml": ["മലയാളം", "Malayalam"], - "mt": ["Malti", "Maltese"], - "mi": ["te reo Māori", "Māori"], - "mr": ["मराठी", "Marathi"], - "mh": ["Kajin M̧ajeļ", "Marshallese"], - "mn": ["Монгол хэл", "Mongolian"], - "na": ["Ekakairũ Naoero", "Nauru"], - "nv": ["Diné bizaad", "Navajo"], - "nd": ["isiNdebele", "Northern Ndebele"], - "ne": ["नेपाली", "Nepali"], - "ng": ["Owambo", "Ndonga"], - "no": ["Norsk", "Norwegian"], - "ii": ["ꆈꌠ꒿", "Nuosu"], - "nr": ["isiNdebele", "Southern Ndebele"], - "oc": ["occitan", "Occitan"], - "oj": ["ᐊᓂᔑᓈᐯᒧᐎᓐ", "Ojibwe"], - "om": ["Afaan Oromoo", "Oromo"], - "or": ["ଓଡ଼ିଆ", "Oriya"], - "os": ["ирон æвзаг", "Ossetian"], - "pa": ["ਪੰਜਾਬੀ", "Punjabi"], - "pi": ["पाऴि", "Pāli"], - "fa": ["فارسی", "Persian"], - "pl": ["polski", "Polish"], - "ps": ["پښتو", "Pashto"], - "pt": ["português", "Portuguese"], - "qu": ["Runa Simi", "Quechua"], - "rm": ["rumantsch grischun", "Romansh"], - "rn": ["Ikirundi", "Kirundi"], - "ro": ["limba română", "Romanian"], - "ru": ["Русский", "Russian"], - "sc": ["sardu", "Sardinian"], - "sd": ["सिन्धी", "Sindhi"], - "se": ["Davvisámegiella", "Northern Sami"], - "sm": ["gagana fa'a Samoa", "Samoan"], - "sg": ["yângâ tî sängö", "Sango"], - "sr": ["српски језик", "Serbian"], - "gd": ["Gàidhlig", "Gaelic"], - "sn": ["chiShona", "Shona"], - "si": ["සිංහල", "Sinhalese"], - "sk": ["slovenčina", "Slovak"], - "sl": ["slovenščina", "Slovene"], - "so": ["Soomaaliga", "Somali"], - "st": ["Sesotho", "Southern Sotho"], - "es": ["español", "Spanish"], - "su": ["Basa Sunda", "Sundanese"], - "sw": ["Kiswahili", "Swahili"], - "ss": ["SiSwati", "Swati"], - "sv": ["svenska", "Swedish"], - "ta": ["தமிழ்", "Tamil"], - "te": ["తెలుగు", "Telugu"], - "tg": ["тоҷикӣ", "Tajik"], - "th": ["ไทย", "Thai"], - "ti": ["ትግርኛ", "Tigrinya"], - "bo": ["བོད་ཡིག", "Tibetan"], - "tk": ["Түркмен", "Turkmen"], - "tl": ["ᜏᜒᜃᜅ᜔ ᜆᜄᜎᜓᜄ᜔", "Tagalog"], - "tn": ["Setswana", "Tswana"], - "to": ["faka Tonga", "Tonga"], - "tr": ["Türkçe", "Turkish"], - "ts": ["Xitsonga", "Tsonga"], - "tt": ["татар теле", "Tatar"], - "ty": ["Reo Tahiti", "Tahitian"], - "ug": ["ئۇيغۇرچە‎", "Uyghur"], - "uk": ["українська мова", "Ukrainian"], - "ur": ["اردو", "Urdu"], - "uz": ["Oʻzbek‎", "Uzbek"], - "ve": ["Tshivenḓa", "Venda"], - "vi": ["Việt Nam", "Vietnamese"], - "vo": ["Volapük", "Volapük"], - "wa": ["walon", "Walloon"], - "cy": ["Cymraeg", "Welsh"], - "wo": ["Wollof", "Wolof"], - "fy": ["Frysk", "Western Frisian"], - "xh": ["isiXhosa", "Xhosa"], - "yi": ["ייִדיש", "Yiddish"], - "yo": ["Yorùbá", "Yoruba"], - "za": ["Saɯ cueŋƅ", "Zhuang"], - "zu": ["isiZulu", "Zulu"] -} diff --git a/i18n/nl.json b/i18n/nl.json deleted file mode 100644 index 8991b815..00000000 --- a/i18n/nl.json +++ /dev/null @@ -1,159 +0,0 @@ -{ - "PrivateBin": "PrivateBin", - "%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted in the browser using 256 bits AES. More information on the project page.": - "%s is een minimalistische, open source online pastebin waarbij de server geen kennis heeft van de geplakte gegevens. Gegevens worden gecodeerd/gedecodeerd in de browser met behulp van 256 bits AES. Meer informatie is te vinden op de projectpagina.", - "Because ignorance is bliss": - "Onwetendheid is een zegen", - "en": "nl", - "Paste does not exist, has expired or has been deleted.": - "Geplakte tekst bestaat niet, is verlopen of verwijderd.", - "%s requires php %s or above to work. Sorry.": - "%s vereist PHP %s of hoger om te kunnen werken. Sorry", - "%s requires configuration section [%s] to be present in configuration file.": - "%s vereist dat de configuratiesectie [%s] aanwezig is in het configuratiebestand", - "Please wait %d seconds between each post.": - "Alstublieft %d seconden wachten tussen elk bericht", - "Paste is limited to %s of encrypted data.": - "Geplakte tekst is beperkt tot %s aan versleutelde gegevens", - "Invalid data.": - "Ongeldige gegevens", - "You are unlucky. Try again.": - "Helaas. Probeer het nog eens", - "Error saving comment. Sorry.": - "Fout bij het opslaan van het commentaar. Sorry", - "Error saving paste. Sorry.": - "Fout bij het opslaan van de geplakte tekst. Sorry.", - "Invalid paste ID.": - "Ongeldige ID.", - "Paste is not of burn-after-reading type.": - "Geplakte tekst is geen 'vernietig na lezen' type", - "Wrong deletion token. Paste was not deleted.": - "Foutieve verwijdercode. Geplakte tekst is niet verwijderd.", - "Paste was properly deleted.": - "Geplakte tekst is correct verwijderd.", - "JavaScript is required for %s to work.
Sorry for the inconvenience.": - "JavaScript vereist om %s te laten werken.
Sorry voor het ongemak.", - "%s requires a modern browser to work.": - "%s vereist een moderne browser om te kunnen werken ", - "Still using Internet Explorer? Do yourself a favor, switch to a modern browser:": - "Gebruik je nog steeds Internet explorer? Doe jezelf een plezier en maak gebruik van een moderne browser:", - "New": - "Nieuw", - "Send": - "Verzenden", - "Clone": - "Clonen", - "Raw text": - "Onbewerkte tekst", - "Expires": - "Verloopt", - "Burn after reading": - "Vernietig na lezen", - "Open discussion": - "Open discussie", - "Password (recommended)": - "Wachtwoord (aanbevolen)", - "Discussion": - "Discussie", - "Toggle navigation": - "Navigatie openen/sluiten", - "%d seconds": ["%d second", "%d seconden"], - "%d minutes": ["%d minuut", "%d minuten"], - "%d hours": ["%d uur"], - "%d days": ["%d dag", "%d dagen"], - "%d weeks": ["%d week", "%d weken"], - "%d months": ["%d maand", "%d maanden"], - "%d years": ["%d jaar"], - "Never": - "Nooit", - "Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": - "Opmerking: Dit is een testservice: Gegevens kunnen op elk gegeven moment verwijderd worden.", - "This document will expire in %d seconds.": - ["Dit document verloopt over %d second.", "Dit document verloopt over %d seconden."], - "This document will expire in %d minutes.": - ["Dit document verloopt over %d minuut.", "Dit document verloopt over %d minuten"], - "This document will expire in %d hours.": - ["Dit document verloopt over %d uur."], - "This document will expire in %d days.": - ["Dit document verloopt over %d dag.", "Dit document verloopt over %d dagen."], - "This document will expire in %d months.": - ["Dit document verloopt over %d maand.", "Dit document verloopt over %d maanden."], - "Please enter the password for this paste:": - "Voer het wachtwoord in voor deze geplakte tekst:", - "Could not decrypt data (Wrong key?)": - "Kon de gegevens niet decoderen (verkeerde sleutel?)", - "Could not delete the paste, it was not stored in burn after reading mode.": - "Verwijderen van de geplakte tekst niet mogelijk, deze werd niet opgeslagen in 'vernietig na lezen' modus.", - "FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": - "FOR YOUR EYES ONLY. Sluit dit venster niet, dit bericht kan niet opnieuw worden weergegeven.", - "Could not decrypt comment; Wrong key?": - "Kon het commentaar niet decoderen; Verkeerde sleutel?", - "Reply": - "Beantwoorden", - "Anonymous": - "Anoniem", - "Avatar generated from IP address": - "Anonieme avatar (van het IP adres)", - "Add comment": - "Commentaar toevoegen", - "Optional nickname…": - "Optionele bijnaam…", - "Post comment": - "Plaats een commentaar", - "Sending comment…": - "Commentaar verzenden…", - "Comment posted.": - "Commentaar geplaatst.", - "Could not refresh display: %s": - "Kon de weergave niet vernieuwen: %s", - "unknown status": - "Onbekende status", - "server error or not responding": - "Serverfout of server reageert niet", - "Could not post comment: %s": - "Kon het commentaar niet plaatsen: %s", - "Please move your mouse for more entropy…": - "Aub uw muis bewegen voor meer entropie…", - "Sending paste…": - "Geplakte tekst verzenden…", - "Your paste is %s (Hit [Ctrl]+[c] to copy)": - "Uw geplakte tekst is %s (Druk [Ctrl]+[c] om te kopiëren)", - "Delete data": - "Gegevens wissen", - "Could not create paste: %s": - "Kon de geplakte tekst niet aanmaken: %s", - "Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": - "Kon de geplakte tekst niet decoderen: Decoderingssleutel ontbreekt in URL (Hebt u een redirector of een URL-verkorter gebruikt die een deel van de URL verwijdert?)", - "Format": "Formaat", - "Plain Text": "Platte tekst", - "Source Code": "Broncode", - "Markdown": "Markdown", - "Download attachment": "Bijlage downloaden", - "Cloned: '%s'": "Gekloond: '%s'", - "The cloned file '%s' was attached to this paste.": "Het gekloonde bestand '%s' is bijgevoegd aan de geplakte tekst.", - "Attach a file": "Een bestand toevoegen", - "alternatively drag & drop a file or paste an image from the clipboard": "U kunt ook een bestand slepen en neerzetten of een afbeelding plakken van het klembord", - "File too large, to display a preview. Please download the attachment.": "Het bestand is te groot om voorbeeld weer te geven. Aub de bijlage downloaden", - "Remove attachment": "Bijlage verwijderen", - "Your browser does not support uploading encrypted files. Please use a newer browser.": - "Uw browser biedt geen ondersteuning voor het uploaden van gecodeerde bestanden. Gebruik alstublieft een nieuwere browser", - "Invalid attachment.": "Ongeldige bijlage", - "Options": "Opties", - "Shorten URL": "URL verkorten", - "Editor": "Editor", - "Preview": "Preview", - "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": - "%s vereist dat het PATH eindigt in een '%s'. Aub het PATH updaten in uw index.php.", - "Decrypt": - "Decoderen", - "Enter password": - "Voer het wachtwoord in", - "Loading…": "Laden…", - "Decrypting paste…": "Geplakte tekst decoderen…", - "Preparing new paste…": "Nieuwe geplakte tekst voorbereiden…", - "In case this message never disappears please have a look at this FAQ for information to troubleshoot.": - "In het geval dat dit bericht nooit verdwijnt, kijkt u dan eens naar veelgestelde vragen voor informatie over het oplossen van problemen .", - "+++ no paste text +++": "+++ geen geplakte tekst +++", - "Could not get paste data: %s": - "Could not get paste data: %s" -} \ No newline at end of file diff --git a/i18n/no.json b/i18n/no.json deleted file mode 100644 index 06fc1213..00000000 --- a/i18n/no.json +++ /dev/null @@ -1,159 +0,0 @@ -{ - "PrivateBin": "PrivateBin", - "%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted in the browser using 256 bits AES. More information on the project page.": - "%s er en minimalistisk, åpen kildekode, elektronisk tilgjengelig pastebin hvor serveren ikke har kunnskap om dataene som limes inn. Dataene krypteres/dekrypteres i nettleseren ved hjelp av 256 bits AES. Mer informasjon om prosjektet på prosjektsiden.", - "Because ignorance is bliss": - "Fordi uvitenhet er lykke", - "en": "no", - "Paste does not exist, has expired or has been deleted.": - "Innlegget eksisterer ikke, er utløpt eller har blitt slettet.", - "%s requires php %s or above to work. Sorry.": - "Beklager, %s krever php %s eller nyere for å kjøre.", - "%s requires configuration section [%s] to be present in configuration file.": - "%s krever konfigurasjonsdel [%s] å være til stede i konfigurasjonsfilen .", - "Please wait %d seconds between each post.": - "Vennligst vent %d sekunder mellom hvert innlegg.", - "Paste is limited to %s of encrypted data.": - "Innlegg er begrenset til %s av kryptert data.", - "Invalid data.": - "Ugyldige data.", - "You are unlucky. Try again.": - "Du er uheldig. Prøv igjen.", - "Error saving comment. Sorry.": - "Beklager, det oppstod en feil ved lagring kommentar.", - "Error saving paste. Sorry.": - "Beklager, det oppstod en feil ved lagring innlegg.", - "Invalid paste ID.": - "Feil innlegg ID.", - "Paste is not of burn-after-reading type.": - "Innlegg er ikke av typen slett etter lesing.", - "Wrong deletion token. Paste was not deleted.": - "Feil slettingsnøkkel. Innlegg ble ikke fjernet.", - "Paste was properly deleted.": - "Innlegget er slettet.", - "JavaScript is required for %s to work.
Sorry for the inconvenience.": - "Javascript kreves for at %s skal fungere
Beklager.", - "%s requires a modern browser to work.": - "%s krever en moderne nettleser for å fungere.", - "Still using Internet Explorer? Do yourself a favor, switch to a modern browser:": - "Fortsatt bruker av Internet Explorer? Gjør deg selv en tjeneste og bytt til en moderne nettleser:", - "New": - "Ny", - "Send": - "Send", - "Clone": - "Kopier", - "Raw text": - "Ren tekst", - "Expires": - "Utgår", - "Burn after reading": - "Slett etter lesing", - "Open discussion": - "Åpen diskusjon", - "Password (recommended)": - "Passord (anbefalt)", - "Discussion": - "Diskusjon", - "Toggle navigation": - "Veksle navigasjon", - "%d seconds": ["%d sekund", "%d sekunder"], - "%d minutes": ["%d minutt", "%d minutter"], - "%d hours": ["%d time", "%d timer"], - "%d days": ["%d dag", "%d dager"], - "%d weeks": ["%d uke", "%d uker"], - "%d months": ["%d måned", "%d måneder"], - "%d years": ["%d år", "%d år"], - "Never": - "Aldri", - "Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": - "Merk: Dette er en test tjeneste: Data kan slettes når som helst. Kattunger vil dø hvis du misbruker denne tjenesten.", - "This document will expire in %d seconds.": - ["Dette dokumentet vil utløpe om %d sekund.", "Dette dokumentet vil utløpe om %d sekunder."], - "This document will expire in %d minutes.": - ["Dette dokumentet vil utløpe om %d minutt.", "Dette dokumentet vil utløpe om %d minutter."], - "This document will expire in %d hours.": - ["Dette dokumentet vil utløpe om %d time.", "Dette dokumentet vil utløpe om %d timer."], - "This document will expire in %d days.": - ["Dette dokumentet vil utløpe om %d dag.", "Dette dokumentet vil utløpe om %d dager."], - "This document will expire in %d months.": - ["Dette dokumentet vil utløpe om %d måned.", "Dette dokumentet vil utløpe om %d måneder."], - "Please enter the password for this paste:": - "Vennligst skriv inn passordet for dette innlegget:", - "Could not decrypt data (Wrong key?)": - "Kunne ikke dekryptere data (Feil nøkkel?)", - "Could not delete the paste, it was not stored in burn after reading mode.": - "Kan ikke slette innlegget, det ble ikke lagret som 'slett etter les' type.", - "FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": - "KUN FOR DINE ØYNE. Ikke lukk dette vinduet, denne meldingen kan ikke bli vist igjen.", - "Could not decrypt comment; Wrong key?": - "Kan ikke dekryptere kommentar; Feil nøkkel?", - "Reply": - "Svar", - "Anonymous": - "Anonym", - "Avatar generated from IP address": - "Anonym avatar generert med data fra IP adressen)", - "Add comment": - "Legg til kommentar", - "Optional nickname…": - "Valgfritt kallenavn…", - "Post comment": - "Send kommentar", - "Sending comment…": - "Sender Kommentar…", - "Comment posted.": - "Kommentar sendt.", - "Could not refresh display: %s": - "Kunne ikke oppdatere bildet: %s", - "unknown status": - "ukjent status", - "server error or not responding": - "tjener feilet eller svarer ikke", - "Could not post comment: %s": - "Kunne ikke sende kommentar: %s", - "Please move your mouse for more entropy…": - "Flytt musen for mer entropi…", - "Sending paste…": - "Sender innlegg…", - "Your paste is %s (Hit [Ctrl]+[c] to copy)": - "Ditt innlegg er %s (Trykk [Ctrl]+[c] for å kopiere)", - "Delete data": - "Slett data", - "Could not create paste: %s": - "Kunne ikke opprette innlegg: %s", - "Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": - "Kan ikke dekryptere innlegg: Dekrypteringsnøkkelen mangler i adressen (Har du bruket en redirector eller en URL forkorter som fjerner en del av addressen?)", - "Format": "Format", - "Plain Text": "Ren Tekst", - "Source Code": "Kildekode", - "Markdown": "Oppmerket", - "Download attachment": "Last ned vedlegg", - "Cloned: '%s'": "Kopiert: '%s'", - "The cloned file '%s' was attached to this paste.": "The cloned file '%s' was attached to this paste.", - "Attach a file": "Legg til fil", - "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", - "File too large, to display a preview. Please download the attachment.": "File too large, to display a preview. Please download the attachment.", - "Remove attachment": "Slett vedlegg", - "Your browser does not support uploading encrypted files. Please use a newer browser.": - "Nettleseren din støtter ikke å laste opp krypterte filer. Vennligst bruk en nyere nettleser.", - "Invalid attachment.": "Ugyldig vedlegg.", - "Options": "Alternativer", - "Shorten URL": "Adresse forkorter", - "Editor": "Rediger", - "Preview": "Forhåndsvis", - "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": - "%s krever at PATH ender på \"%s\". Vennligst oppdater PATH i index.php.", - "Decrypt": - "Dekrypter", - "Enter password": - "Skriv inn passord", - "Loading…": "Laster…", - "Decrypting paste…": "Dekrypterer innlegg…", - "Preparing new paste…": "Klargjør nytt innlegg…", - "In case this message never disappears please have a look at this FAQ for information to troubleshoot.": - "Hvis denne meldingen ikke forsvinner kan du ta en titt på siden med ofte stilte spørsmål for informasjon om feilsøking.", - "+++ no paste text +++": "+++ ingen innleggstekst +++", - "Could not get paste data: %s": - "Could not get paste data: %s" -} \ No newline at end of file diff --git a/i18n/oc.json b/i18n/oc.json deleted file mode 100644 index 2902304e..00000000 --- a/i18n/oc.json +++ /dev/null @@ -1,168 +0,0 @@ -{ - "PrivateBin": "PrivateBin", - "%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted in the browser using 256 bits AES. More information on the project page.": - "%s es un 'pastebin' (o gestionari d’extrachs de tèxte e còdi font) minimalista e open source, dins lo qual lo servidor a pas cap de coneissença de las donadas mandadas. Las donadas son chifradas/deschifradas dins lo navigator per un chiframent AES 256 bits. Mai informacions sus la pagina del projècte.", - "Because ignorance is bliss": - "Perque lo bonaür es l’ignorància", - "en": "oc", - "Paste does not exist, has expired or has been deleted.": - "Lo tèxte existís pas, a expirat, o es estat suprimit.", - "%s requires php %s or above to work. Sorry.": - "O planhèm, %s necessita php %s o superior per foncionar.", - "%s requires configuration section [%s] to be present in configuration file.": - "%s fa besonh de la seccion de configuracion [%s] dins lo fichièr de configuracion per foncionar.", - "Please wait %d seconds between each post.": - "Mercés d'esperar %d segondas entre cada publicacion.", - "Paste is limited to %s of encrypted data.": - "Lo tèxte es limitat a %s de donadas chifradas.", - "Invalid data.": - "Donadas invalidas.", - "You are unlucky. Try again.": - "Pas cap de fortuna. Tornatz ensajar.", - "Error saving comment. Sorry.": - "Error al moment de salvagardar lo comentari. O planhèm.", - "Error saving paste. Sorry.": - "Error al moment de salvagardar lo tèxte. O planhèm.", - "Invalid paste ID.": - "ID del tèxte invalid.", - "Paste is not of burn-after-reading type.": - "Lo tèxte es pas del tip \"Escafar aprèp lectura\".", - "Wrong deletion token. Paste was not deleted.": - "Geton de supression incorrècte. Lo tèxte es pas estat suprimit.", - "Paste was properly deleted.": - "Lo tèxte es estat correctament suprimit.", - "JavaScript is required for %s to work.
Sorry for the inconvenience.": - "JavaScript es requesit per far foncionar %s.
O planhèm per l’inconvenient.", - "%s requires a modern browser to work.": - "%s necessita un navigator modèrn per foncionar.", - "Still using Internet Explorer? Do yourself a favor, switch to a modern browser:": - "Encora sus Internet Explorer ? Fasètz-vos una favor, passatz a un navigator modèrn :", - "New": - "Nòu", - "Send": - "Mandar", - "Clone": - "Clonar", - "Raw text": - "Tèxte brut", - "Expires": - "Expira", - "Burn after reading": - "Escafar aprèp lectura", - "Open discussion": - "Autorizar la discussion", - "Password (recommended)": - "Senhal (recomandat)", - "Discussion": - "Discussion", - "Toggle navigation": - "Virar la navigacion", - "%d seconds": ["%d segonda", "%d segondas"], - "%d minutes": ["%d minuta", "%d minutas"], - "%d hours": ["%d ora", "%d oras"], - "%d days": ["%d jorn", "%d jorns"], - "%d weeks": ["%d setmana", "%d setmanas"], - "%d months": ["%d mes", "%d meses"], - "%d years": ["%d an", "%d ans"], - "Never": - "Jamai", - "Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": - "Nota : Aquò es un servici d’espròva : las donadas pòdon èsser suprimidas a cada moment. De catons moriràn s’abusatz d’aqueste servici.", - "This document will expire in %d seconds.": - ["Ce document expirera dans %d seconde.", "Aqueste document expirarà dins %d segondas."], - "This document will expire in %d minutes.": - ["Ce document expirera dans %d minute.", "Aqueste document expirarà dins %d minutas."], - "This document will expire in %d hours.": - ["Ce document expirera dans %d heure.", "Aqueste document expirarà dins %d oras."], - "This document will expire in %d days.": - ["Ce document expirera dans %d jour.", "Aqueste document expirarà dins %d jorns."], - "This document will expire in %d months.": - ["Ce document expirera dans %d mois.", "Aqueste document expirarà dins %d meses."], - "Please enter the password for this paste:": - "Picatz lo senhal per aqueste tèxte :", - "Could not decrypt data (Wrong key?)": - "Impossible de deschifrar las donadas (marrida clau ?)", - "Could not delete the paste, it was not stored in burn after reading mode.": - "Impossible de suprimir lo tèxte, perque es pas estat gardat en mòde \"Escafar aprèp lectura\".", - "FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": - "PER VÒSTRES UÈLHS SOLAMENT. Tampetz pas aquesta fenèstra, aqueste tèxte poirà pas mai èsser afichat.", - "Could not decrypt comment; Wrong key?": - "Impossible de deschifrar lo comentari ; marrida clau ?", - "Reply": - "Respondre", - "Anonymous": - "Anonime", - "Avatar generated from IP address": - "Avatar anonime (Vizhash de l’adreça IP)", - "Add comment": - "Apondre un comentari", - "Optional nickname…": - "Escais opcional…", - "Post comment": - "Mandar lo comentari", - "Sending comment…": - "Mandadís del comentari…", - "Comment posted.": - "Comentari mandat.", - "Could not refresh display: %s": - "Impossible d’actualizar l’afichatge : %s", - "unknown status": - "Estatut desconegut", - "server error or not responding": - "Lo servidor respond pas o a rencontrat una error", - "Could not post comment: %s": - "Impossible de mandar lo comentari : %s", - "Please move your mouse for more entropy…": - "Mercés de bolegar vòstra mirga per mai entropia…", - "Sending paste…": - "Mandadís del tèxte…", - "Your paste is %s (Hit [Ctrl]+[c] to copy)": - "Vòstre tèxte es disponible a l’adreça %s (Picatz sus [Ctrl]+[c] per copiar)", - "Delete data": - "Supprimir las donadas del tèxte", - "Could not create paste: %s": - "Impossible de crear lo tèxte : %s", - "Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": - "Impossible de deschifrar lo tèxte : clau de deschiframent absenta de l’URL (Avètz utilizat un redirector o un site de reduccion d’URL que suprimís una partida de l’URL ?)", - "B": "o", - "KiB": "Kio", - "MiB": "Mio", - "GiB": "Gio", - "TiB": "Tio", - "PiB": "Pio", - "EiB": "Eio", - "ZiB": "Zio", - "YiB": "Yio", - "Format": "Format", - "Plain Text": "Tèxte brut", - "Source Code": "Còdi font", - "Markdown": "Markdown", - "Download attachment": "Telecargar la pèça junta", - "Cloned: '%s'": "Clonar : '%s'", - "The cloned file '%s' was attached to this paste.": "Aqueste fichièr clonat '%s' es estat ajustat a aqueste tèxte.", - "Attach a file": "Juntar un fichièr", - "alternatively drag & drop a file or paste an image from the clipboard": "autrament lisatz lo fichièr o pegatz l’imatge del quichapapièrs", - "File too large, to display a preview. Please download the attachment.": "Fichièr tròp pesuc per mostrar un apercebut. Telecargatz la pèca junta.", - "Remove attachment": "Levar la pèça junta", - "Your browser does not support uploading encrypted files. Please use a newer browser.": - "Vòstre navigator es pas compatible amb lo mandadís de fichièrs chifrats. Mercés d’emplegar un navigator mai recent.", - "Invalid attachment.": "Pèça junta invalida.", - "Options": "Opcions", - "Shorten URL": "Acorchir l’URL", - "Editor": "Editar", - "Preview": "Previsualizar", - "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": - "%s demanda que lo PATH termine en \"%s\". Mercés de metre a jorn lo PATH dins vòstre index.php.", - "Decrypt": - "Deschifrar", - "Enter password": - "Picatz lo senhal", - "Loading…": "Cargament…", - "Decrypting paste…": "Deschirament del tèxte…", - "Preparing new paste…": "Preparacion…", - "In case this message never disappears please have a look at this FAQ for information to troubleshoot.": - "Se per cas aqueste messatge quita pas de s’afichar mercés de gaitar aquesta FAQ per las solucions (en anglés).", - "+++ no paste text +++": "+++ cap de tèxte pegat +++", - "Could not get paste data: %s": - "Could not get paste data: %s" -} \ No newline at end of file diff --git a/i18n/pl.json b/i18n/pl.json deleted file mode 100644 index 7440cf05..00000000 --- a/i18n/pl.json +++ /dev/null @@ -1,159 +0,0 @@ -{ - "PrivateBin": "PrivateBin", - "%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted in the browser using 256 bits AES. More information on the project page.": - "%s jest minimalistycznym, otwartoźródłowym serwisem typu pastebin, w którym serwer nie ma jakichkolwiek informacji o tym, co jest wklejane. Dane są szyfrowane i deszyfrowane w przeglądarce z użyciem 256-bitowego klucza AES. Więcej informacji na stronie projektu.", - "Because ignorance is bliss": - "Ponieważ ignorancja jest cnotą", - "en": "pl", - "Paste does not exist, has expired or has been deleted.": - "Wklejka nie istnieje, wygasła albo została usunięta.", - "%s requires php %s or above to work. Sorry.": - "%s wymaga PHP w wersji %s lub nowszej, sorry.", - "%s requires configuration section [%s] to be present in configuration file.": - "%s wymaga obecności sekcji [%s] w pliku konfiguracyjnym.", - "Please wait %d seconds between each post.": - "Poczekaj %d sekund pomiędzy każdą wklejką.", - "Paste is limited to %s of encrypted data.": - "Wklejka jest limitowana do %s zaszyfrowanych danych.", - "Invalid data.": - "Nieprawidłowe dane.", - "You are unlucky. Try again.": - "Miałeś pecha. Spróbuj ponownie.", - "Error saving comment. Sorry.": - "Błąd przy zapisywaniu komentarza, sorry.", - "Error saving paste. Sorry.": - "Błąd przy zapisywaniu wklejki, sorry.", - "Invalid paste ID.": - "Nieprawidłowe ID wklejki.", - "Paste is not of burn-after-reading type.": - "Ta wklejka nie ulega autodestrukcji po przeczytaniu.", - "Wrong deletion token. Paste was not deleted.": - "Nieprawidłowy token usuwania. Wklejka nie została usunięta.", - "Paste was properly deleted.": - "Wklejka usunięta poprawnie.", - "JavaScript is required for %s to work.
Sorry for the inconvenience.": - "Do działania %sa jest wymagany JavaScript. Przepraszamy za tę niedogodność.", - "%s requires a modern browser to work.": - "%s wymaga do działania nowoczesnej przeglądarki.", - "Still using Internet Explorer? Do yourself a favor, switch to a modern browser:": - "Cały czas używasz Internet Explorera? Zrób sobie przysługę, przesiądź się na nowoczesną przeglądarkę:", - "New": - "Nowa", - "Send": - "Wyślij", - "Clone": - "Sklonuj", - "Raw text": - "Czysty tekst", - "Expires": - "Wygasa za", - "Burn after reading": - "Zniszcz po przeczytaniu", - "Open discussion": - "Otwarta dyskusja", - "Password (recommended)": - "Hasło (zalecane)", - "Discussion": - "Dyskusja", - "Toggle navigation": - "Przełącz nawigację", - "%d seconds": ["%d second", "%d second", "%d second"], - "%d minutes": ["%d minut", "%d minut", "%d minut"], - "%d hours": ["%d godzina", "%d godzina", "%d godzinę"], - "%d days": ["%d dzień", "%d dzień", "%d dzień"], - "%d weeks": ["%d tydzień", "%d tydzień", "%d tydzień"], - "%d months": ["%d miesiąc", "%d miesiąc", "%d miesiąc"], - "%d years": ["%d rok", "%d rok", "%d rok"], - "Never": - "nigdy", - "Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": - "Notka: To jest usługa testowa. Dane mogą zostać usunięte w dowolnym momencie. Kociątka umrą, jeśli nadużyjesz tej usługi.", - "This document will expire in %d seconds.": - ["Ten dokument wygaśnie za %d sekundę.", "Ten dokument wygaśnie za %d sekund."], - "This document will expire in %d minutes.": - ["Ten dokument wygaśnie za %d minutę.", "Ten dokument wygaśnie za %d minut."], - "This document will expire in %d hours.": - ["Ten dokument wygaśnie za godzinę.", "Ten dokument wygaśnie za %d godzin."], - "This document will expire in %d days.": - ["Ten dokument wygaśnie za %d dzień.", "Ten dokument wygaśnie za %d dni."], - "This document will expire in %d months.": - ["Ten dokument wygaśnie za miesiąc.", "Ten dokument wygaśnie za %d miesięcy."], - "Please enter the password for this paste:": - "Wpisz hasło dla tej wklejki:", - "Could not decrypt data (Wrong key?)": - "Nie udało się odszyfrować danych (zły klucz?)", - "Could not delete the paste, it was not stored in burn after reading mode.": - "Nie udało się usunąć wklejki, nie została zapisana w trybie zniszczenia po przeczytaniu.", - "FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": - "TYLKO DO TWOJEGO WGLĄDU. Nie zamykaj tego okna, ta wiadomość nie będzie mogła być wyświetlona ponownie.", - "Could not decrypt comment; Wrong key?": - "Nie udało się odszyfrować komentarza; zły klucz?", - "Reply": - "Odpowiedz", - "Anonymous": - "Anonim", - "Avatar generated from IP address": - "Anonimowy avatar (Vizhash z adresu IP)", - "Add comment": - "Dodaj komentarz", - "Optional nickname…": - "Opcjonalny nick…", - "Post comment": - "Wyślij komentarz", - "Sending comment…": - "Wysyłanie komentarza…", - "Comment posted.": - "Wysłano komentarz.", - "Could not refresh display: %s": - "Nie można odświeżyć widoku: %s", - "unknown status": - "nieznany status", - "server error or not responding": - "bląd serwera lub brak odpowiedzi", - "Could not post comment: %s": - "Nie udało się wysłać komentarza: %s", - "Please move your mouse for more entropy…": - "Proszę poruszać myszą aby uzyskać większą entropię…", - "Sending paste…": - "Wysyłanie wklejki…", - "Your paste is %s (Hit [Ctrl]+[c] to copy)": - "Twoja wklejka to %s (wciśnij [Ctrl]+[c] aby skopiować)", - "Delete data": - "Skasuj dane", - "Could not create paste: %s": - "Nie udało się utworzyć wklejki: %s", - "Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": - "Nie udało się odszyfrować wklejki - brak klucza deszyfrującego w adresie (użyłeś skracacza linków, który ucina część adresu?)", - "Format": "Format", - "Plain Text": "Czysty tekst", - "Source Code": "Kod źródłowy", - "Markdown": "Markdown", - "Download attachment": "Pobierz załącznik", - "Cloned: '%s'": "Sklonowano: '%s'", - "The cloned file '%s' was attached to this paste.": "The cloned file '%s' was attached to this paste.", - "Attach a file": "Załącz plik", - "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", - "File too large, to display a preview. Please download the attachment.": "File too large, to display a preview. Please download the attachment.", - "Remove attachment": "Usuń załącznik", - "Your browser does not support uploading encrypted files. Please use a newer browser.": - "Twoja przeglądarka nie wspiera wysyłania zaszyfrowanych plików. Użyj nowszej przeglądarki.", - "Invalid attachment.": "Nieprawidłowy załącznik.", - "Options": "Opcje", - "Shorten URL": "Skróć adres URL", - "Editor": "Edytować", - "Preview": "Zapowiedź", - "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": - "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.", - "Decrypt": - "Decrypt", - "Enter password": - "Wpisz hasło", - "Loading…": "Loading…", - "Decrypting paste…": "Decrypting paste…", - "Preparing new paste…": "Preparing new paste…", - "In case this message never disappears please have a look at this FAQ for information to troubleshoot.": - "In case this message never disappears please have a look at this FAQ for information to troubleshoot (in English).", - "+++ no paste text +++": "+++ no paste text +++", - "Could not get paste data: %s": - "Could not get paste data: %s" -} \ No newline at end of file diff --git a/i18n/pt.json b/i18n/pt.json deleted file mode 100644 index 339e7ff6..00000000 --- a/i18n/pt.json +++ /dev/null @@ -1,159 +0,0 @@ -{ - "PrivateBin": "PrivateBin", - "%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted in the browser using 256 bits AES. More information on the project page.": - "%s é um serviço minimalista e de código aberto do tipo \"pastebin\", em que o servidor tem zero conhecimento dos dados copiados. Os dados são cifrados e decifrados no navegador usando 256 bits AES. Mais informações na página do projeto.", - "Because ignorance is bliss": - "Porque a ignorância é uma benção", - "en": "pt", - "Paste does not exist, has expired or has been deleted.": - "A cópia não existe, expirou ou já foi excluída.", - "%s requires php %s or above to work. Sorry.": - "%s requer php %s ou superior para funcionar. Desculpa.", - "%s requires configuration section [%s] to be present in configuration file.": - "%s requer que a seção de configuração [% s] esteja no arquivo de configuração.", - "Please wait %d seconds between each post.": - "Por favor espere %d segundos entre cada publicação.", - "Paste is limited to %s of encrypted data.": - "A cópia está limitada a %s de dados cifrados.", - "Invalid data.": - "Dados inválidos.", - "You are unlucky. Try again.": - "Você é azarado. Tente novamente", - "Error saving comment. Sorry.": - "Erro ao salvar comentário. Desculpa.", - "Error saving paste. Sorry.": - "Erro ao salvar cópia. Desculpa.", - "Invalid paste ID.": - "ID de cópia inválido.", - "Paste is not of burn-after-reading type.": - "Cópia não é do tipo \"queime após ler\".", - "Wrong deletion token. Paste was not deleted.": - "Token de remoção inválido. A cópia não foi excluída.", - "Paste was properly deleted.": - "A cópia foi devidamente excluída.", - "JavaScript is required for %s to work.
Sorry for the inconvenience.": - "JavaScript é necessário para que %s funcione.
Pedimos desculpas pela inconveniência.", - "%s requires a modern browser to work.": - "%s requer um navegador moderno para funcionar.", - "Still using Internet Explorer? Do yourself a favor, switch to a modern browser:": - "Ainda usando Internet Explorer? Faça-se um favor, mude para um navegador moderno:", - "New": - "Novo", - "Send": - "Enviar", - "Clone": - "Clonar", - "Raw text": - "Texto sem formato", - "Expires": - "Expirar em", - "Burn after reading": - "Queime após ler", - "Open discussion": - "Discussão aberta", - "Password (recommended)": - "Senha (recomendada)", - "Discussion": - "Discussão", - "Toggle navigation": - "Mudar navegação", - "%d seconds": ["%d segundo", "%d segundos"], - "%d minutes": ["%d minuto", "%d minutos"], - "%d hours": ["%d hora", "%d horas"], - "%d days": ["%d dia", "%d dias"], - "%d weeks": ["%d semana", "%d semanas"], - "%d months": ["%d mês", "%d meses"], - "%d years": ["%d ano", "%d anos"], - "Never": - "Nunca", - "Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": - "Nota: Este é um serviço de teste. Dados podem ser perdidos a qualquer momento. Gatinhos morrerão se você abusar desse serviço.", - "This document will expire in %d seconds.": - ["Este documento irá expirar em um segundo.", "Este documento irá expirar em %d segundos."], - "This document will expire in %d minutes.": - ["Este documento irá expirar em um minuto.", "Este documento irá expirar em %d minutos."], - "This document will expire in %d hours.": - ["Este documento irá expirar em uma hora.", "Este documento irá expirar em %d horas."], - "This document will expire in %d days.": - ["Este documento irá expirar em um dia.", "Este documento irá expirar em %d dias."], - "This document will expire in %d months.": - ["Este documento irá expirar em um mês.", "Este documento irá expirar em %d meses."], - "Please enter the password for this paste:": - "Por favor, digite a senha para essa cópia:", - "Could not decrypt data (Wrong key?)": - "Não foi possível decifrar os dados (Chave errada?)", - "Could not delete the paste, it was not stored in burn after reading mode.": - "Não foi possível excluir a cópia, ela não foi salva no modo de \"queime após ler\".", - "FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": - "APENAS PARA SEUS OLHOS. Não feche essa janela, essa mensagem não pode ser exibida novamente.", - "Could not decrypt comment; Wrong key?": - "Não foi possível decifrar o comentário; Chave errada?", - "Reply": - "Responder", - "Anonymous": - "Anônimo", - "Avatar generated from IP address": - "Avatar gerado à partir do endereço IP", - "Add comment": - "Adicionar comentário", - "Optional nickname…": - "Apelido opcional…", - "Post comment": - "Publicar comentário", - "Sending comment…": - "Enviando comentário…", - "Comment posted.": - "Comentário publicado.", - "Could not refresh display: %s": - "Não foi possível atualizar a tela: %s", - "unknown status": - "Estado desconhecido", - "server error or not responding": - "Servidor em erro ou não responsivo", - "Could not post comment: %s": - "Não foi possível publicar o comentário: %s", - "Please move your mouse for more entropy…": - "Por favor, mova o mouse para maior entropia…", - "Sending paste…": - "Enviando cópia…", - "Your paste is %s (Hit [Ctrl]+[c] to copy)": - "Sua cópia é %s (Pressione [Ctrl]+[c] para copiar)", - "Delete data": - "Excluir dados", - "Could not create paste: %s": - "Não foi possível criar cópia: %s", - "Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": - "Não foi possível decifrar a cópia: chave de decriptografia ausente na URL (Você utilizou um redirecionador ou encurtador de URL que removeu parte dela?)", - "Format": "Formato", - "Plain Text": "Texto sem formato", - "Source Code": "Código fonte", - "Markdown": "Markdown", - "Download attachment": "Baixar anexo", - "Cloned: '%s'": "Clonado: '%s'", - "The cloned file '%s' was attached to this paste.": "O arquivo clonado '%s' foi anexado a essa cópia.", - "Attach a file": "Anexar um arquivo", - "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", - "File too large, to display a preview. Please download the attachment.": "File too large, to display a preview. Please download the attachment.", - "Remove attachment": "Remover anexo", - "Your browser does not support uploading encrypted files. Please use a newer browser.": - "Seu navegador não permite subir arquivos cifrados. Por favor, utilize um navegador mais recente.", - "Invalid attachment.": "Anexo inválido.", - "Options": "Opções", - "Shorten URL": "Encurtar URL", - "Editor": "Editor", - "Preview": "Visualizar", - "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": - "%s requer que o PATH termine em \"%s\". Por favor, atualize o PATH em seu index.php.", - "Decrypt": - "Decifrar", - "Enter password": - "Digite a senha", - "Loading…": "Carregando…", - "Decrypting paste…": "Decifrando cópia…", - "Preparing new paste…": "Preparando nova cópia…", - "In case this message never disappears please have a look at this FAQ for information to troubleshoot.": - "Caso essa mensagem nunca desapareça, por favor veja este FAQ para saber como resolver os problemas.", - "+++ no paste text +++": "+++ sem texto de cópia +++", - "Could not get paste data: %s": - "Could not get paste data: %s" -} \ No newline at end of file diff --git a/i18n/ru.json b/i18n/ru.json deleted file mode 100644 index 0867e780..00000000 --- a/i18n/ru.json +++ /dev/null @@ -1,169 +0,0 @@ -{ - "PrivateBin": "PrivateBin", - "%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted in the browser using 256 bits AES. More information on the project page.": - "%s это минималистичный Open Source проект для создания заметок, где сервер не знает ничего о сохраняемых данных. Данные шифруются/расшифровываются в браузере с использованием 256 битного шифрования AES. Подробнее можно узнать на сайте проекта.", - "Because ignorance is bliss": - "Потому что неведение - благо", - "en": "ru", - "Paste does not exist, has expired or has been deleted.": - "Запись не существует, просрочена или была удалена.", - "%s requires php %s or above to work. Sorry.": - "Для работы %s требуется php %s или выше. Извините.", - "%s requires configuration section [%s] to be present in configuration file.": - "%s необходимо наличие секции [%s] в конфигурационном файле.", - "Please wait %d seconds between each post.": - ["Пожалуйста ожидайте %d секунду между каждыми записями.", "Пожалуйста ожидайте %d секунды между каждыми записями.", "Пожалуйста ожидайте %d секунд между каждыми записями."], - "Paste is limited to %s of encrypted data.": - "Размер записи ограничен %s зашифрованных данных.", - "Invalid data.": - "Неверные данные.", - "You are unlucky. Try again.": - "Вам не повезло. Попробуйте еще раз.", - "Error saving comment. Sorry.": - "Ошибка при сохранении комментария. Извините.", - "Error saving paste. Sorry.": - "Ошибка при сохранении записи. Извините.", - "Invalid paste ID.": - "Неверный ID записи.", - "Paste is not of burn-after-reading type.": - "Тип записи не \"Удалить после прочтения\".", - "Wrong deletion token. Paste was not deleted.": - "Неверный ключ удаления записи. Запись не удалена", - "Paste was properly deleted.": - "Запись была успешно удалена.", - "JavaScript is required for %s to work.
Sorry for the inconvenience.": - "Для работы %s требуется включенный JavaScript.
Приносим извинения за неудобства.", - "%s requires a modern browser to work.": - "Для работы %s требуется более современный браузер.", - "Still using Internet Explorer? Do yourself a favor, switch to a modern browser:": - "До сих пор используете Internet Explorer? Пожалейте себя, перейдите на более современный браузер:", - "New": - "Новая запись", - "Send": - "Отправить", - "Clone": - "Дублировать", - "Raw text": - "Исходный текст", - "Expires": - "Удалить через", - "Burn after reading": - "Удалить после прочтения", - "Open discussion": - "Открыть обсуждение", - "Password (recommended)": - "Пароль (рекомендуется)", - "Discussion": - "Обсуждение", - "Toggle navigation": - "Переключить навигацию", - "%d seconds": ["%d секунду", "%d секунды", "%d секунд"], - "%d minutes": ["%d минуту", "%d минуты", "%d минут"], - "%d hours": ["%d час", "%d часа", "%d часов"], - "%d days": ["%d день", "%d дня", "%d дней"], - "%d weeks": ["%d неделю", "%d недели", "%d недель"], - "%d months": ["%d месяц", "%d месяца", "%d месяцев"], - "%d years": ["%d год", "%d года", "%d лет"], - "Never": - "Никогда", - "Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": - "Примечание: Этот сервис тестовый: Данные могут быть удалены в любое время. Котята умрут, если вы будете злоупотреблять серсисом.", - "This document will expire in %d seconds.": - ["Документ будет удален через %d секунду.", "Документ будет удален через %d секунды.", "Документ будет удален через %d секунд."], - "This document will expire in %d minutes.": - ["Документ будет удален через %d минуту.", "Документ будет удален через %d минуты.", "Документ будет удален через %d минут."], - "This document will expire in %d hours.": - ["Документ будет удален через %d час.", "Документ будет удален через %d часа.", "Документ будет удален через %d часов."], - "This document will expire in %d days.": - ["Документ будет удален через %d день.", "Документ будет удален через %d дня.", "Документ будет удален через %d дней."], - "This document will expire in %d months.": - ["Документ будет удален через %d месяц.", "Документ будет удален через %d месяца.", "Документ будет удален через %d месяцев."], - "Please enter the password for this paste:": - "Пожалуйста введите пароль от записи:", - "Could not decrypt data (Wrong key?)": - "Невозможно расшифровать данные (Неверный ключ?)", - "Could not delete the paste, it was not stored in burn after reading mode.": - "Невозможно удалить запись, она не была сохранена в режиме удаления после прочтения", - "FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": - "ТОЛЬКО ДЛЯ ВАШИХ ГЛАЗ. Не закрывайте это окно, это сообщение не может быть показано снова.", - "Could not decrypt comment; Wrong key?": - "Невозможно расшифровать комментарий; Неверный ключ?", - "Reply": - "Ответить", - "Anonymous": - "Аноним", - "Avatar generated from IP address": - "Аватар, сгенерированный из IP-адреса", - "Add comment": - "Добавить комментарий", - "Optional nickname…": - "Опциональный никнейм…", - "Post comment": - "Отправить комментарий", - "Sending comment…": - "Отправка комментария…", - "Comment posted.": - "Комментарий опубликован.", - "Could not refresh display: %s": - "Не удалось обновить отображение: %s", - "unknown status": - "неизвестная причина", - "server error or not responding": - "ошибка сервера или нет ответа", - "Could not post comment: %s": - "Не удалось опубликовать комментарий: %s", - "Please move your mouse for more entropy…": - "Пожалуйста двигайте мышкой для большей энтропии…", - "Sending paste…": - "Отправка записи…", - "Your paste is %s (Hit [Ctrl]+[c] to copy)": - "Ссылка на запись %s (Нажмите [Ctrl]+[c] чтобы скопировать ссылку)", - "Delete data": - "Удалить запись", - "Could not create paste: %s": - "Не удалось опубликовать запись: %s", - "Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": - "Невозможно расшифровать запись: Ключ расшифровки отсутствует в ссылке (Может быть вы используете сокращатель ссылок, который удаляет часть ссылки?)", - "B": "байт", - "KiB": "Кбайт", - "MiB": "Мбайт", - "GiB": "Гбайт", - "TiB": "Тбайт", - "PiB": "Пбайт", - "EiB": "Эбайт", - "ZiB": "Збайт", - "YiB": "Йбайт", - "Format": "Формат", - "Plain Text": "Обычный текст", - "Source Code": "Исходный код", - "Markdown": "Язык разметки", - "Download attachment": "Скачать прикрепленный файл", - "Cloned: '%s'": "Дублировано: '%s'", - "The cloned file '%s' was attached to this paste.": - "Дубликат файла '%s' был прикреплен к этой записи.", - "Attach a file": "Прикрепить файл", - "alternatively drag & drop a file or paste an image from the clipboard": "так же можно перенести файл в окно браузера или вставить изображение из буфера", - "File too large, to display a preview. Please download the attachment.": "Файл слишком большой для отображения предпросмотра. Пожалуйста скачайте прикрепленный файл.", - "Remove attachment": "Удалить вложение", - "Your browser does not support uploading encrypted files. Please use a newer browser.": - "Ваш браузер не поддерживает отправку зашифрованных файлов. Используйте более новый браузер.", - "Invalid attachment.": "Неизвестное вложение.", - "Options": "Опции", - "Shorten URL": "Короткая ссылка", - "Editor": "Редактор", - "Preview": "Предпросмотр", - "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": - "Переменная PATH необходима %s в конце \"%s\". Пожалуйста обновите переменную PATH в вашем index.php.", - "Decrypt": - "Расшифровать", - "Enter password": - "Введите пароль", - "Loading…": "Загрузка…", - "Decrypting paste…": "Расшифровка записи…", - "Preparing new paste…": "Подготовка новой записи…", - "In case this message never disappears please have a look at this FAQ for information to troubleshoot.": - "Если данное сообщение не исчезает длительное время, посмотрите этот FAQ с информацией о возможном решении проблемы (на английском).", - "+++ no paste text +++": "+++ в записи нет текста +++", - "Could not get paste data: %s": - "Не удалось получить данные записи: %s" -} diff --git a/i18n/sl.json b/i18n/sl.json deleted file mode 100644 index f58a1632..00000000 --- a/i18n/sl.json +++ /dev/null @@ -1,168 +0,0 @@ -{ - "PrivateBin": "PrivateBin", - "%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted in the browser using 256 bits AES. More information on the project page.": - "%s je minimalističen, odprtokodni spletni 'pastebin', kjer server ne ve ničesar o prilepljenih podatkih. Podatki so zakodirani/odkodirani v brskalniku z uporabo 256 bitnega AES. Več informacij na < href=\"https://privatebin.info/\">spletni strani projekta..", - "Because ignorance is bliss": - "Ker kar ne veš ne boli.", - "en": "sl", - "Paste does not exist, has expired or has been deleted.": - "Prilepek ne obstaja, mu je potekla življenjska doba, ali pa je izbrisan.", - "%s requires php %s or above to work. Sorry.": - "Oprosti, %s za delovanje potrebuje vsaj php %s.", - "%s requires configuration section [%s] to be present in configuration file.": - "%s potrebuje sekcijo konfiguracij [%s] v konfiguracijski datoteki.", - "Please wait %d seconds between each post.": - "Prosim počakaj vsaj %d sekund pred vsako naslednjo objavo.", - "Paste is limited to %s of encrypted data.": - "Velikost prilepka je omejena na %s zakodiranih podatkov.", - "Invalid data.": - "Neveljavni podatki.", - "You are unlucky. Try again.": - "Nimaš sreče, poskusi ponovno.", - "Error saving comment. Sorry.": - "Nekaj je šlo narobe pri shranjevanju komentarja. Oprosti.", - "Error saving paste. Sorry.": - "Nekaj je šlo narobe pri shranjevanju prilepka. Oprosti.", - "Invalid paste ID.": - "Napačen ID prilepka.", - "Paste is not of burn-after-reading type.": - "Prilepek ni tipa zažgi-po-branju.", - "Wrong deletion token. Paste was not deleted.": - "Napačen token za izbris. Prilepek ni bil izbrisan..", - "Paste was properly deleted.": - "Prilepek je uspešno izbrisan.", - "JavaScript is required for %s to work.
Sorry for the inconvenience.": - "Da %s deluje, moraš vklopiti JavaScript.
Oprosti za povročene nevšečnosti.", - "%s requires a modern browser to work.": - "%s za svoje delovanje potrebuje moderen brskalnik.", - "Still using Internet Explorer? Do yourself a favor, switch to a modern browser:": - "Še vedno uporabljaš Internet Explorer? Naredi si uslugo, preklopi na moderen brskalnik:", - "New": - "Nov prilepek", - "Send": - "Pošlji", - "Clone": - "Kloniraj", - "Raw text": - "Surov tekst", - "Expires": - "Poteče", - "Burn after reading": - "Zažgi (pobriši) po branju", - "Open discussion": - "Dovoli razpravo", - "Password (recommended)": - "Geslo (priporočeno)", - "Discussion": - "Razprava", - "Toggle navigation": - "Preklopi navigacijo", - "%d seconds": ["%d sekunda", "%d sekundi", "%d sekunde", "%d sekund"], - "%d minutes": ["%d minuta", "%d minuti", "%d minute", "%d minut"], - "%d hours": ["%d ura", "%d uri", "%d ure", "%d ur"], - "%d days": ["%d dan", "%d dneva", "%d dnevi", "%d dni"], - "%d weeks": ["%d teden", "%d tedna", "%d tedni", "%d tednov"], - "%d months": ["%d mesec", "%d meseca", "%d meseci", "%d mesecev"], - "%d years": ["%d leto", "%d leti", "%d leta", "%d let"], - "Never": - "Nikoli", - "Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": - "Ne pozabi: To je testna storitev: Podatki so lahko kadarkoli pobrisani. Mucki bodo umrli, če boš zlorabljala to storitev.", - "This document will expire in %d seconds.": - ["Ta dokument bo potekel čez %d sekundo.", "Ta dokument bo potekel čez %d sekundi.", "Ta dokument bo potekel čez %d sekunde.", "Ta dokument bo potekel čez %d sekund."], - "This document will expire in %d minutes.": - ["Ta dokument bo potekel čez %d minuto.", "Ta dokument bo potekel čez %d minuti.", "Ta dokument bo potekel čez %d minute.", "Ta dokument bo potekel čez %d minut."], - "This document will expire in %d hours.": - ["Ta dokument bo potekel čez %d uro.", "Ta dokument bo potekel čez %d uri.", "Ta dokument bo potekel čez %d ure.", "Ta dokument bo potekel čez %d ur."], - "This document will expire in %d days.": - ["Ta dokument bo potekel čez %d dan.", "Ta dokument bo potekel čez %d dni.", "Ta dokument bo potekel čez %d dni.", "Ta dokument bo potekel čez %d dni."], - "This document will expire in %d months.": - ["Ta dokument bo potekel čez %d mesec.", "Ta dokument bo potekel čez %d meseca.", "Ta dokument bo potekel čez %d mesece.", "Ta dokument bo potekel čez %d mesecev."], - "Please enter the password for this paste:": - "Prosim vnesi geslo tega prilepka:", - "Could not decrypt data (Wrong key?)": - "Nemogoče odkodirati podakte (Imaš napačen ključ?)", - "Could not delete the paste, it was not stored in burn after reading mode.": - "Prilepek je nemogoče izbrisati, ni bil shranjen v načinu \"zažgi po branju\".", - "FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": - "SAMO ZA TVOJE OČI. Ne zapri tega okna (zavihka), to sporočilo ne bo prikazano nikoli več.", - "Could not decrypt comment; Wrong key?": - "Ne morem odkodirati komentarja: Imaš napačen ključ?", - "Reply": - "Odgovori", - "Anonymous": - "Aninomno", - "Avatar generated from IP address": - "Anonimen avatar (Vizhash IP naslova)", - "Add comment": - "Dodaj komentar", - "Optional nickname…": - "Uporabniško ime (lahko izpustiš)", - "Post comment": - "Objavi komentar", - "Sending comment…": - "Pošiljam komentar …", - "Comment posted.": - "Komentar poslan.", - "Could not refresh display: %s": - "Ne morem osvežiti zaslona : %s", - "unknown status": - "neznan status", - "server error or not responding": - "napaka na strežniku, ali pa se strežnik ne odziva", - "Could not post comment: %s": - "Komentarja ni bilo mogoče objaviti : %s", - "Please move your mouse for more entropy…": - "Prosim premakni svojo miško za več entropije…", - "Sending paste…": - "Pošiljam prilepek…", - "Your paste is %s (Hit [Ctrl]+[c] to copy)": - "Tvoj prilepek je dostopen na naslovu: %s (Pritisni [Ctrl]+[c] ali [Cmd] + [c] in skopiraj)", - "Delete data": - "Izbriši podatke", - "Could not create paste: %s": - "Ne morem ustvariti prilepka: %s", - "Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": - "Ne morem odkodirati prilepka: V URL-ju manjka ključ (A si uporabil krajšalnik URL-jev, ki odstrani del URL-ja?)", - "B": "o", - "KiB": "KB", - "MiB": "MB", - "GiB": "GB", - "TiB": "TB", - "PiB": "PB", - "EiB": "EB", - "ZiB": "ZB", - "YiB": "YB", - "Format": "Format", - "Plain Text": "Surov tekst", - "Source Code": "Odprta koda", - "Markdown": "Markdown", - "Download attachment": "Pretoči priponko", - "Cloned: '%s'": "'%s' klonirana", - "The cloned file '%s' was attached to this paste.": "The cloned file '%s' was attached to this paste.", - "Attach a file": "Pripni datoteko", - "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", - "File too large, to display a preview. Please download the attachment.": "File too large, to display a preview. Please download the attachment.", - "Remove attachment": "Odstrani priponko", - "Your browser does not support uploading encrypted files. Please use a newer browser.": - "Tvoj brskalnik ne omogoča nalaganje zakodiranih datotek. Prosim uporabi novejši brskalnik.", - "Invalid attachment.": "Neveljavna priponka.", - "Options": "Možnosti", - "Shorten URL": "Skrajšajte URL", - "Editor": "Uredi", - "Preview": "Predogled", - "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": - "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.", - "Decrypt": - "Decrypt", - "Enter password": - "Prosim vnesi geslo", - "Loading…": "Loading…", - "Decrypting paste…": "Decrypting paste…", - "Preparing new paste…": "Preparing new paste…", - "In case this message never disappears please have a look at this FAQ for information to troubleshoot.": - "In case this message never disappears please have a look at this FAQ for information to troubleshoot (in English).", - "+++ no paste text +++": "+++ no paste text +++", - "Could not get paste data: %s": - "Could not get paste data: %s" -} diff --git a/i18n/zh.json b/i18n/zh.json deleted file mode 100644 index d6ec69a1..00000000 --- a/i18n/zh.json +++ /dev/null @@ -1,159 +0,0 @@ -{ - "PrivateBin": "PrivateBin", - "%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted in the browser using 256 bits AES. More information on the project page.": - "%s是一个极简,开源,对粘贴内容毫不知情的在线粘贴板,数据在浏览器内进行AES-256加密。更多信息请查看项目主页。", - "Because ignorance is bliss": - "因为无知是福", - "en": "zh", - "Paste does not exist, has expired or has been deleted.": - "粘贴不存在,已过期或者已被删除。", - "%s requires php %s or above to work. Sorry.": - "%s需要工作于PHP %s及以上版本,抱歉。", - "%s requires configuration section [%s] to be present in configuration file.": - "%s需要设置配置文件中 [%s] 的部分。", - "Please wait %d seconds between each post.": - "每 %d 秒只能粘贴一次。", - "Paste is limited to %s of encrypted data.": - "粘贴受限于 %s 加密数据。", - "Invalid data.": - "无效的数据。", - "You are unlucky. Try again.": - "请再试一次。", - "Error saving comment. Sorry.": - "存储评论时出现错误,抱歉。", - "Error saving paste. Sorry.": - "存储粘贴时出现错误,抱歉。", - "Invalid paste ID.": - "无效的ID。", - "Paste is not of burn-after-reading type.": - "粘贴不是阅后即焚类型。", - "Wrong deletion token. Paste was not deleted.": - "错误的删除token,粘贴没有被删除。", - "Paste was properly deleted.": - "粘贴已被正确删除。", - "JavaScript is required for %s to work.
Sorry for the inconvenience.": - "%s需要JavaScript来进行加解密。
带来的不便敬请谅解。", - "%s requires a modern browser to work.": - "%s需要工作于现代化的浏览器。", - "Still using Internet Explorer? Do yourself a favor, switch to a modern browser:": - "还在使用Internet Explorer?帮自己个忙,换上一个现代化的浏览器:", - "New": - "新建", - "Send": - "送出", - "Clone": - "克隆", - "Raw text": - "纯文本", - "Expires": - "有效期", - "Burn after reading": - "阅后即焚", - "Open discussion": - "开放讨论", - "Password (recommended)": - "密码 (推荐)", - "Discussion": - "讨论", - "Toggle navigation": - "切换导航栏", - "%d seconds": ["%d 秒", "%d 秒"], - "%d minutes": ["%d 分钟", "%d 分钟"], - "%d hours": ["%d 小时", "%d 小时"], - "%d days": ["%d 天", "%d 天"], - "%d weeks": ["%d 周", "%d 周"], - "%d months": ["%d 个月", "%d 个月"], - "%d years": ["%d 年", "%d 年"], - "Never": - "永不过期", - "Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": - "注意:这是一个测试服务,数据随时可能被删除。如果你滥用这个服务的话,小猫咪会死的。", - "This document will expire in %d seconds.": - ["这份文档将在一秒后过期。", "这份文档将在 %d 秒后过期"], - "This document will expire in %d minutes.": - ["这份文档将在一分钟后过期。", "这份文档将在 %d 分钟后过期。"], - "This document will expire in %d hours.": - ["这份文档将在一小时后过期。", "这份文档将在 %d 小时后过期。"], - "This document will expire in %d days.": - ["这份文档将在一天后过期。", "这份文档将在 %d 天后过期。"], - "This document will expire in %d months.": - ["这份文档将在一个月后过期。", "这份文档将在 %d 个月后过期。"], - "Please enter the password for this paste:": - "请输入这份粘贴的密码:", - "Could not decrypt data (Wrong key?)": - "无法解密数据 (密钥错误?)", - "Could not delete the paste, it was not stored in burn after reading mode.": - "无法删除此粘贴,它没有以阅后即焚模式存储。", - "FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": - "看!仔!细!了! 不要关闭窗口,否则你再也见不到这条消息了。", - "Could not decrypt comment; Wrong key?": - "无法解密评论; 密钥错误?", - "Reply": - "回复", - "Anonymous": - "匿名", - "Avatar generated from IP address": - "由IP生成的头像", - "Add comment": - "添加评论", - "Optional nickname…": - "可选昵称…", - "Post comment": - "评论", - "Sending comment…": - "评论发送中…", - "Comment posted.": - "评论已发送。", - "Could not refresh display: %s": - "无法刷新显示: %s", - "unknown status": - "未知状态", - "server error or not responding": - "服务器错误或无回应", - "Could not post comment: %s": - "无法发送评论: %s", - "Please move your mouse for more entropy…": - "请移动鼠标增加随机性…", - "Sending paste…": - "粘贴提交中…", - "Your paste is %s (Hit [Ctrl]+[c] to copy)": - "您的粘贴的链接是%s (按下 [Ctrl]+[c] 以复制)", - "Delete data": - "删除数据", - "Could not create paste: %s": - "无法创建粘贴: %s", - "Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": - "无法解密粘贴: URL中缺失解密密钥 (是否使用了重定向或者短链接导致密钥丢失?)", - "Format": "格式", - "Plain Text": "纯文本", - "Source Code": "源代码", - "Markdown": "Markdown", - "Download attachment": "下载附件", - "Cloned: '%s'": "克隆: '%s'", - "The cloned file '%s' was attached to this paste.": "克隆文件 '%s' 已附加到此粘贴。", - "Attach a file": "添加一个附件", - "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", - "File too large, to display a preview. Please download the attachment.": "File too large, to display a preview. Please download the attachment.", - "Remove attachment": "移除附件", - "Your browser does not support uploading encrypted files. Please use a newer browser.": - "您的浏览器不支持上传加密的文件,请使用更新的浏览器。", - "Invalid attachment.": "无效的附件", - "Options": "选项", - "Shorten URL": "缩短链接", - "Editor": "编辑", - "Preview": "预览", - "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": - "%s 的 PATH 变量必须结束于 \"%s\"。 请修改你的 index.php 中的 PATH 变量。", - "Decrypt": - "解密", - "Enter password": - "输入密码", - "Loading…": "载入中…", - "Decrypting paste…": "正在解密", - "Preparing new paste…": "正在准备新的粘贴", - "In case this message never disappears please have a look at this FAQ for information to troubleshoot.": - "如果这个消息一直不消失,请参考 这里的 FAQ 进行故障排除 (英文版)。", - "+++ no paste text +++": "+++ 没有粘贴内容 +++", - "Could not get paste data: %s": - "Could not get paste data: %s" -} diff --git a/img/android-chrome-192x192.png b/img/android-chrome-192x192.png deleted file mode 100644 index 42baf7532f7c05cc70cc10ba87d439d9c9430d7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5557 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�|_bmAFOPt)pezimddp}xL~ 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 AhyVZp diff --git a/img/apple-touch-icon.png b/img/apple-touch-icon.png deleted file mode 100644 index aa6e2b04f5aad58330fe940912389c386cac964b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3967 zcmV-_4}kEAP)jr6`V&EAt53EuoQfJd}lQk|D_dxJ{021aZg7i zP*6~Uf`Xu+p!{wW=4lnXR~6E~bk1HCa%MJPUR|AzPwVUJU{)>H!D^^b6?1WEu%1

EtG@Gs)<@X>E4 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 F0RRA>u*CoX diff --git a/img/favicon-32x32.png b/img/favicon-32x32.png deleted file mode 100644 index be42cb39f80d27c172bff4e647048f3af8eb45c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 749 zcmV<{00000001#DF(Dx#RaI3aBqT5}FaZDn|K1e;+7J$I( z761Gc|MnFb85sZN6^>Rg|I8C&CjxB>%S~yk#IJBOGij0)jLF?(62b zv#p_gTm6zqk6%0gqBzxdH2=*nYDFXeiXZ=b8?;6Q?9{^1v!9xllGvt(rjC5$muPTO zKd@vquUHxXxd(JO0>gtz+W-In3v^OWQveOYWA?Np`KgLaDleTw00057Nkl%lDxrwAnD#b z>~_A74~kQ%F3WF}-J&?2NaCu@zbd`MgX4)191&8TmF1sL@!z}dq+F`4TS>c{>bKN7_L1|#{NQZxese>L1(JTs0di#`yseP{m)ZhM>Jw{AxOz_Kp0XZ zksO6>Uwain*a1PmWjlJsc@X;4u_^>Jv(8wvI1B28HVPs9V$6)`tBr!J5q{&3Jy9oU zsz`y6(5H&3pm2{?$gE&y0o{UE1RSBM<82{a&;ZRvRp7S6SON9|9AG!;gxGdyU%5qX z<07e{B1mftm%`BHsTIIv&KNnNb%D81D$SPfztbm!8`DdOe9Q&r{T<4Q2Eb^5#>>f; zl~oTs;mKA$5IMJs`MIg>8k+1P!aJE@X_i3x=@^`7Dx diff --git a/img/favicon.ico b/img/favicon.ico deleted file mode 100644 index e3bc3e239dc3e16b4ae63ca55e1aaf2b40bb5158..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15086 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 Rt?18a1L1YXFqS#Y{Xbs2mQVly diff --git a/img/icon.svg b/img/icon.svg deleted file mode 100644 index d63c65db..00000000 --- a/img/icon.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/img/icon_clone.png b/img/icon_clone.png deleted file mode 100644 index 455b82f9a40a71933355b6ad0f55aea953e6c72e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 266 zcmeAS@N?(olHy`uVBq!ia0vp^{6H+o!3-o#udq!9Qh@ea+PQNlkP8&twQJYo$B(B?n+D;&fB$~|{P~HAiA$C&*|u%l z`t|FlOqr6Ko7;I{;d+owB|(0{3@;-+{vD|B(0~8<@r@f7)748X?|ueKhI_g=hDcmK zdfrp0L4n65&{Ja0)Q+Zm{}-4|TV(#>eO!Lf$_omX&c$uT>$(l!B&}JMSTE{i6lP#^ z?@I=&^TzAKf*-TjOE10hcFQ8>@CTPZZH`X+x9j+B^=Sh9;#@}$rvt5E@O1TaS?83{ F1OQGUes}-? diff --git a/img/icon_new.png b/img/icon_new.png deleted file mode 100644 index dd96fa2bd9d37a83cd10a27c252a06a87238750f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 157 zcmeAS@N?(olHy`uVBq!ia0vp^+(69F!VDx22y1{Sxd5LK*Z=?j1DQY)EBHC#i9b-9 zvn0qb*pcC9;O_`83(cuVoNR%Ds-7;6Asp9}XIK`itzN*;kz~jcJm-`^RuEH1R)PjY ekb^;^6BomA4t<{J?r$wX4Gf;HelF{r5}E*4S3C;< diff --git a/img/icon_qr.png b/img/icon_qr.png deleted file mode 100644 index 28d10ca7bf9cdaadc3ea7a22089195e29530a906..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 299 zcmeAS@N?(olHy`uVBq!ia0vp^%0R5f!VDz$SlQnMQq09po*^6@9Je3(KLBziOI#yL zg7ec#$`gxH8PfCeb5nJTlZ#SQ^NKU_OWrf@w*xBT5AX?b1=9BR_VxAk`}gnv|Nnov zx#KmU&|*&)#}JM4y@3aL4=eDLtmO+xWy&(-SY=cuQaa&8YLibxM(+D)A6&FK&hl2) z`plinyn2^5%-puJuz>gM-gga;+78dTe`bZ^k10>JPd)$Y?e1ss_3G?ZyQUc4NV+a2 vyz7(tW{oR8A)+^@2=;{q{G9pw{uTC(YvKhj)l26Boy*|q>gTe~DWM4fSHFGk diff --git a/img/icon_raw.png b/img/icon_raw.png deleted file mode 100644 index 41b586f0768436cdbcd96d9e37efca73396a2acd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 183 zcmeAS@N?(olHy`uVBq!ia0vp^{2A# d!jqYp8BTu?u$gks^cBz+22WQ%mvv4FO#nJ2IC%g7 diff --git a/img/icon_send.png b/img/icon_send.png deleted file mode 100644 index a6e62ebd155de13a1254600643cb481cd14d106b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^LO{&V!VDy(S2QUCDXjpX5LY1mpE%IA`;gTe~DWM4fS&vna*S0MeL5ZJ=m`x2;*yCldj znBm*IlRN9OBh;jMr}SNW1Qd4hba4#fxSp($z`&%il5>%TsKmC0jA^_)yM-G{%qC1r zNO&-T?b2*Xi5cb0FYhw)Tug}S@|HT+e)8~@!(R`dX`acynV;dPg3R4&+4Vnw<}rA> L`njxgN@xNA9FSGS diff --git a/img/logo.svg b/img/logo.svg deleted file mode 100644 index edbc27ef..00000000 --- a/img/logo.svg +++ /dev/null @@ -1 +0,0 @@ -PrivateBin diff --git a/img/mstile-144x144.png b/img/mstile-144x144.png deleted file mode 100644 index 819530770bc9c5c1a8c68177e896fc2f89bedca1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3644 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 diff --git a/img/mstile-70x70.png b/img/mstile-70x70.png deleted file mode 100644 index 02b11be03649f5f493d68667acc0fbfd1085d580..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2424 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 diff --git a/index.php b/index.php deleted file mode 100644 index bb1bf064..00000000 --- a/index.php +++ /dev/null @@ -1,18 +0,0 @@ -= 256 || c1 >= 256 || c2 >= 256) - throw 'unsupported character found'; - var n = (c0 << 16) | (c1 << 8) | c2; - b64.push( - b64charcodes[ n >>> 18], - b64charcodes[(n >>> 12) & 63], - b64charcodes[(n >>> 6) & 63], - b64charcodes[ n & 63] - ); - } - while (padlen--) b64[b64.length - padlen - 1] = '='.charCodeAt(0); - return chunkStringFromCharCodeApply(b64); -}; - -var convertBase64ToUTF8Array = function(b64){ - b64 = b64.replace(/[^A-Za-z0-9+\/]+/g, ''); - var bin = []; - var padlen = b64.length % 4; - for (var i = 0, l = b64.length; i < l; i += 4){ - var n = ((b64tab[b64.charAt(i )] || 0) << 18) - | ((b64tab[b64.charAt(i+1)] || 0) << 12) - | ((b64tab[b64.charAt(i+2)] || 0) << 6) - | ((b64tab[b64.charAt(i+3)] || 0)); - bin.push( - ( n >> 16 ), - ( (n >> 8) & 0xff ), - ( n & 0xff ) - ); - } - bin.length -= [0,0,2,1][padlen]; - return bin; -}; - -var convertUTF16ArrayToUTF8Array = function(uni){ - var bin = []; - for (var i = 0, l = uni.length; i < l; i++){ - var n = uni[i]; - if (n < 0x80) - bin.push(n); - else if (n < 0x800) - bin.push( - 0xc0 | (n >>> 6), - 0x80 | (n & 0x3f)); - else - bin.push( - 0xe0 | ((n >>> 12) & 0x0f), - 0x80 | ((n >>> 6) & 0x3f), - 0x80 | (n & 0x3f)); - } - return bin; -}; - -var convertUTF8ArrayToUTF16Array = function(bin){ - var uni = []; - for (var i = 0, l = bin.length; i < l; i++){ - var c0 = bin[i]; - if (c0 < 0x80){ - uni.push(c0); - }else{ - var c1 = bin[++i]; - if (c0 < 0xe0){ - uni.push(((c0 & 0x1f) << 6) | (c1 & 0x3f)); - }else{ - var c2 = bin[++i]; - uni.push( - ((c0 & 0x0f) << 12) | ((c1 & 0x3f) << 6) | (c2 & 0x3f) - ); - } - } - } - return uni; -}; - -var convertUTF8StringToBase64 = function(bin){ - return convertUTF8ArrayToBase64(stringToArray(bin)); -}; - -var convertBase64ToUTF8String = function(b64){ - return chunkStringFromCharCodeApply(convertBase64ToUTF8Array(b64)); -}; - -var convertUTF8StringToUTF16Array = function(bin){ - return convertUTF8ArrayToUTF16Array(stringToArray(bin)); -}; - -var convertUTF8ArrayToUTF16String = function(bin){ - return chunkStringFromCharCodeApply(convertUTF8ArrayToUTF16Array(bin)); -}; - -var convertUTF8StringToUTF16String = function(bin){ - return chunkStringFromCharCodeApply( - convertUTF8ArrayToUTF16Array(stringToArray(bin)) - ); -}; - -var convertUTF16StringToUTF8Array = function(uni){ - return convertUTF16ArrayToUTF8Array(stringToArray(uni)); -}; - -var convertUTF16ArrayToUTF8String = function(uni){ - return chunkStringFromCharCodeApply(convertUTF16ArrayToUTF8Array(uni)); -}; - -var convertUTF16StringToUTF8String = function(uni){ - return chunkStringFromCharCodeApply( - convertUTF16ArrayToUTF8Array(stringToArray(uni)) - ); -}; - -/* - * String.fromCharCode.apply will only handle arrays as big as 65536, - * after that it'll return a truncated string with no warning. - */ -var chunkStringFromCharCodeApply = function(arr){ - var strs = [], i; - for (i = 0; i < arr.length; i += 65536){ - strs.push(String.fromCharCode.apply(String, arr.slice(i, i+65536))); - } - return strs.join(''); -}; - -if (global.btoa){ - var btoa = global.btoa; - var convertUTF16StringToBase64 = function (uni){ - return btoa(convertUTF16StringToUTF8String(uni)); - }; -} -else { - var btoa = convertUTF8StringToBase64; - var convertUTF16StringToBase64 = function (uni){ - return convertUTF8ArrayToBase64(convertUTF16StringToUTF8Array(uni)); - }; -} - -if (global.atob){ - var atob = global.atob; - var convertBase64ToUTF16String = function (b64){ - return convertUTF8StringToUTF16String(atob(b64)); - }; -} -else { - var atob = convertBase64ToUTF8String; - var convertBase64ToUTF16String = function (b64){ - return convertUTF8ArrayToUTF16String(convertBase64ToUTF8Array(b64)); - }; -} - -global.Base64 = { - convertUTF8ArrayToBase64:convertUTF8ArrayToBase64, - convertByteArrayToBase64:convertUTF8ArrayToBase64, - convertBase64ToUTF8Array:convertBase64ToUTF8Array, - convertBase64ToByteArray:convertBase64ToUTF8Array, - convertUTF16ArrayToUTF8Array:convertUTF16ArrayToUTF8Array, - convertUTF16ArrayToByteArray:convertUTF16ArrayToUTF8Array, - convertUTF8ArrayToUTF16Array:convertUTF8ArrayToUTF16Array, - convertByteArrayToUTF16Array:convertUTF8ArrayToUTF16Array, - convertUTF8StringToBase64:convertUTF8StringToBase64, - convertBase64ToUTF8String:convertBase64ToUTF8String, - convertUTF8StringToUTF16Array:convertUTF8StringToUTF16Array, - convertUTF8ArrayToUTF16String:convertUTF8ArrayToUTF16String, - convertByteArrayToUTF16String:convertUTF8ArrayToUTF16String, - convertUTF8StringToUTF16String:convertUTF8StringToUTF16String, - convertUTF16StringToUTF8Array:convertUTF16StringToUTF8Array, - convertUTF16StringToByteArray:convertUTF16StringToUTF8Array, - convertUTF16ArrayToUTF8String:convertUTF16ArrayToUTF8String, - convertUTF16StringToUTF8String:convertUTF16StringToUTF8String, - convertUTF16StringToBase64:convertUTF16StringToBase64, - convertBase64ToUTF16String:convertBase64ToUTF16String, - fromBase64:convertBase64ToUTF8String, - toBase64:convertUTF8StringToBase64, - atob:atob, - btoa:btoa, - utob:convertUTF16StringToUTF8String, - btou:convertUTF8StringToUTF16String, - encode:convertUTF16StringToBase64, - encodeURI:function(u){ - return convertUTF16StringToBase64(u).replace(/[+\/]/g, function(m0){ - return m0 == '+' ? '-' : '_'; - }).replace(/=+$/, ''); - }, - decode:function(a){ - return convertBase64ToUTF16String(a.replace(/[-_]/g, function(m0){ - return m0 == '-' ? '+' : '/'; - })); - } -}; - -})(this); diff --git a/js/base64-2.4.5.js b/js/base64-2.4.5.js deleted file mode 100644 index 447964cc..00000000 --- a/js/base64-2.4.5.js +++ /dev/null @@ -1 +0,0 @@ -(function(global,factory){typeof exports==="object"&&typeof module!=="undefined"?module.exports=factory(global):typeof define==="function"&&define.amd?define(factory):factory(global)})(typeof self!=="undefined"?self:typeof window!=="undefined"?window:typeof global!=="undefined"?global:this,function(global){"use strict";var _Base64=global.Base64;var version="2.4.5";var buffer;if(typeof module!=="undefined"&&module.exports){try{buffer=require("buffer").Buffer}catch(err){}}var b64chars="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var b64tab=function(bin){var t={};for(var i=0,l=bin.length;i>>6)+fromCharCode(128|cc&63):fromCharCode(224|cc>>>12&15)+fromCharCode(128|cc>>>6&63)+fromCharCode(128|cc&63)}else{var cc=65536+(c.charCodeAt(0)-55296)*1024+(c.charCodeAt(1)-56320);return fromCharCode(240|cc>>>18&7)+fromCharCode(128|cc>>>12&63)+fromCharCode(128|cc>>>6&63)+fromCharCode(128|cc&63)}};var re_utob=/[\uD800-\uDBFF][\uDC00-\uDFFFF]|[^\x00-\x7F]/g;var utob=function(u){return u.replace(re_utob,cb_utob)};var cb_encode=function(ccc){var padlen=[0,2,1][ccc.length%3],ord=ccc.charCodeAt(0)<<16|(ccc.length>1?ccc.charCodeAt(1):0)<<8|(ccc.length>2?ccc.charCodeAt(2):0),chars=[b64chars.charAt(ord>>>18),b64chars.charAt(ord>>>12&63),padlen>=2?"=":b64chars.charAt(ord>>>6&63),padlen>=1?"=":b64chars.charAt(ord&63)];return chars.join("")};var btoa=global.btoa?function(b){return global.btoa(b)}:function(b){return b.replace(/[\s\S]{1,3}/g,cb_encode)};var _encode=buffer?buffer.from&&Uint8Array&&buffer.from!==Uint8Array.from?function(u){return(u.constructor===buffer.constructor?u:buffer.from(u)).toString("base64")}:function(u){return(u.constructor===buffer.constructor?u:new buffer(u)).toString("base64")}:function(u){return btoa(utob(u))};var encode=function(u,urisafe){return!urisafe?_encode(String(u)):_encode(String(u)).replace(/[+\/]/g,function(m0){return m0=="+"?"-":"_"}).replace(/=/g,"")};var encodeURI=function(u){return encode(u,true)};var re_btou=new RegExp(["[À-ß][€-¿]","[à-ï][€-¿]{2}","[ð-÷][€-¿]{3}"].join("|"),"g");var cb_btou=function(cccc){switch(cccc.length){case 4:var cp=(7&cccc.charCodeAt(0))<<18|(63&cccc.charCodeAt(1))<<12|(63&cccc.charCodeAt(2))<<6|63&cccc.charCodeAt(3),offset=cp-65536;return fromCharCode((offset>>>10)+55296)+fromCharCode((offset&1023)+56320);case 3:return fromCharCode((15&cccc.charCodeAt(0))<<12|(63&cccc.charCodeAt(1))<<6|63&cccc.charCodeAt(2));default:return fromCharCode((31&cccc.charCodeAt(0))<<6|63&cccc.charCodeAt(1))}};var btou=function(b){return b.replace(re_btou,cb_btou)};var cb_decode=function(cccc){var len=cccc.length,padlen=len%4,n=(len>0?b64tab[cccc.charAt(0)]<<18:0)|(len>1?b64tab[cccc.charAt(1)]<<12:0)|(len>2?b64tab[cccc.charAt(2)]<<6:0)|(len>3?b64tab[cccc.charAt(3)]:0),chars=[fromCharCode(n>>>16),fromCharCode(n>>>8&255),fromCharCode(n&255)];chars.length-=[0,0,2,1][padlen];return chars.join("")};var atob=global.atob?function(a){return global.atob(a)}:function(a){return a.replace(/[\s\S]{1,4}/g,cb_decode)};var _decode=buffer?buffer.from&&Uint8Array&&buffer.from!==Uint8Array.from?function(a){return(a.constructor===buffer.constructor?a:buffer.from(a,"base64")).toString()}:function(a){return(a.constructor===buffer.constructor?a:new buffer(a,"base64")).toString()}:function(a){return btou(atob(a))};var decode=function(a){return _decode(String(a).replace(/[-_]/g,function(m0){return m0=="-"?"+":"/"}).replace(/[^A-Za-z0-9\+\/]/g,""))};var noConflict=function(){var Base64=global.Base64;global.Base64=_Base64;return Base64};global.Base64={VERSION:version,atob:atob,btoa:btoa,fromBase64:decode,toBase64:encode,utob:utob,encode:encode,encodeURI:encodeURI,btou:btou,decode:decode,noConflict:noConflict};if(typeof Object.defineProperty==="function"){var noEnum=function(v){return{value:v,enumerable:false,writable:true,configurable:true}};global.Base64.extendString=function(){Object.defineProperty(String.prototype,"fromBase64",noEnum(function(){return decode(this)}));Object.defineProperty(String.prototype,"toBase64",noEnum(function(urisafe){return encode(this,urisafe)}));Object.defineProperty(String.prototype,"toBase64URI",noEnum(function(){return encode(this,true)}))}}if(global["Meteor"]){Base64=global.Base64}if(typeof module!=="undefined"&&module.exports){module.exports.Base64=global.Base64}else if(typeof define==="function"&&define.amd){define([],function(){return global.Base64})}return{Base64:global.Base64}}); diff --git a/js/bootstrap-3.3.7.js b/js/bootstrap-3.3.7.js deleted file mode 100644 index 9bcd2fcc..00000000 --- a/js/bootstrap-3.3.7.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Bootstrap v3.3.7 (http://getbootstrap.com) - * Copyright 2011-2016 Twitter, Inc. - * Licensed under the MIT license - */ -if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1||b[0]>3)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){if(a(b.target).is(this))return b.handleObj.handler.apply(this,arguments)}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.7",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a("#"===f?[]:f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.7",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c).prop(c,!0)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c).prop(c,!1))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")?(c.prop("checked")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.prop("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target).closest(".btn");b.call(d,"toggle"),a(c.target).is('input[type="radio"], input[type="checkbox"]')||(c.preventDefault(),d.is("input,button")?d.trigger("focus"):d.find("input:visible,button:visible").first().trigger("focus"))}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.7",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));if(!(a>this.$items.length-1||a<0))return this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){if(!this.sliding)return this.slide("next")},c.prototype.prev=function(){if(!this.sliding)return this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.7",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger(a.Event("hidden.bs.dropdown",f)))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.7",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger(a.Event("shown.bs.dropdown",h))}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&jdocument.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth

',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);if(c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusout"==b.type?"focus":"hover"]=!1),!c.isInStateTrue())return clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-mo.width?"left":"left"==h&&k.left-lg.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;jg.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null,a.$element=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;!e&&/destroy|hide/.test(b)||(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.7",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.7",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b=e[a]&&(void 0===e[a+1]||b .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.7",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return e=a-d&&"bottom"},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery); \ No newline at end of file diff --git a/js/comment.jsonld b/js/comment.jsonld deleted file mode 100644 index 3ce0a4df..00000000 --- a/js/comment.jsonld +++ /dev/null @@ -1,16 +0,0 @@ -{ - "@context": { - "so": "https://schema.org/", - "status": "so:Integer", - "id": "so:name", - "parentid": "so:name", - "url: { - "@id": "so:url", - "@type": "@id" - }, - "data": "so:Text", - "meta": { - "@id": "?jsonld=commentmeta" - } - } -} \ No newline at end of file diff --git a/js/commentmeta.jsonld b/js/commentmeta.jsonld deleted file mode 100644 index 4b74cb96..00000000 --- a/js/commentmeta.jsonld +++ /dev/null @@ -1,8 +0,0 @@ -{ - "@context": { - "so": "https://schema.org/", - "postdate": "so:Integer", - "nickname": "so:Text", - "vizhash": "so:Text" - } -} \ No newline at end of file diff --git a/js/common.js b/js/common.js deleted file mode 100644 index bc3bd399..00000000 --- a/js/common.js +++ /dev/null @@ -1,160 +0,0 @@ -'use strict'; - -// testing prerequisites -global.assert = require('assert'); -global.jsc = require('jsverify'); -global.jsdom = require('jsdom-global'); -global.cleanup = global.jsdom(); -global.fs = require('fs'); - -// application libraries to test -global.$ = global.jQuery = require('./jquery-3.3.1'); -global.sjcl = require('./sjcl-1.0.7'); -global.Base64 = require('./base64-2.4.5').Base64; -global.RawDeflate = require('./rawdeflate-0.5').RawDeflate; -global.RawDeflate.inflate = require('./rawinflate-0.3').RawDeflate.inflate; -require('./prettify'); -global.prettyPrint = window.PR.prettyPrint; -global.prettyPrintOne = window.PR.prettyPrintOne; -global.showdown = require('./showdown-1.8.6'); -global.DOMPurify = require('./purify-1.0.7'); -require('./bootstrap-3.3.7'); -require('./privatebin'); - -// internal variables -var a2zString = ['a','b','c','d','e','f','g','h','i','j','k','l','m', - 'n','o','p','q','r','s','t','u','v','w','x','y','z'], - alnumString = a2zString.concat(['0','1','2','3','4','5','6','7','8','9']), - queryString = alnumString.concat(['+','%','&','.','*','-','_']), - hashString = queryString.concat(['!']), - base64String = alnumString.concat(['+','/','=']).concat( - a2zString.map(function(c) { - return c.toUpperCase(); - }) - ), - schemas = ['ftp','gopher','http','https','ws','wss'], - supportedLanguages = ['de', 'es', 'fr', 'it', 'no', 'pl', 'pt', 'oc', 'ru', 'sl', 'zh'], - mimeTypes = ['image/png', 'application/octet-stream'], - formats = ['plaintext', 'markdown', 'syntaxhighlighting'], - /** - * character to HTML entity lookup table - * - * @see {@link https://github.com/janl/mustache.js/blob/master/mustache.js#L60} - */ - entityMap = { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - "'": ''', - '/': '/', - '`': '`', - '=': '=' - }, - logFile = fs.createWriteStream('test.log'), - mimeFile = fs.createReadStream('/etc/mime.types'), - mimeLine = ''; - -// redirect console messages to log file -console.info = console.warn = console.error = function () { - logFile.write(Array.prototype.slice.call(arguments).join('') + '\n'); -}; - -// populate mime types from environment -mimeFile.on('data', function(data) { - mimeLine += data; - var index = mimeLine.indexOf('\n'); - while (index > -1) { - var line = mimeLine.substring(0, index); - mimeLine = mimeLine.substring(index + 1); - parseMime(line); - index = mimeLine.indexOf('\n'); - } -}); - -mimeFile.on('end', function() { - if (mimeLine.length > 0) { - parseMime(mimeLine); - } -}); - -function parseMime(line) { - // ignore comments - var index = line.indexOf('#'); - if (index > -1) { - line = line.substring(0, index); - } - - // ignore bits after tabs - index = line.indexOf('\t'); - if (index > -1) { - line = line.substring(0, index); - } - if (line.length > 0) { - mimeTypes.push(line); - } -} - -// common testing helper functions - -/** - * convert all applicable characters to HTML entities - * - * @see {@link https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet#RULE_.231_-_HTML_Escape_Before_Inserting_Untrusted_Data_into_HTML_Element_Content} - * @name htmlEntities - * @function - * @param {string} str - * @return {string} escaped HTML - */ -exports.htmlEntities = function(str) { - return String(str).replace( - /[&<>"'`=\/]/g, function(s) { - return entityMap[s]; - }); -}; - -// provides random lowercase characters from a to z -exports.jscA2zString = function() { - return jsc.elements(a2zString); -}; - -// provides random lowercase alpha numeric characters (a to z and 0 to 9) -exports.jscAlnumString = function() { - return jsc.elements(alnumString); -}; - -// provides random characters allowed in GET queries -exports.jscQueryString = function() { - return jsc.elements(queryString); -}; - -// provides random characters allowed in hash queries -exports.jscHashString = function() { - return jsc.elements(hashString); -}; - -// provides random characters allowed in base64 encoded strings -exports.jscBase64String = function() { - return jsc.elements(base64String); -}; - -// provides a random URL schema supported by the whatwg-url library -exports.jscSchemas = function() { - return jsc.elements(schemas); -}; - -// provides a random supported language string -exports.jscSupportedLanguages = function() { - return jsc.elements(supportedLanguages); -}; - -// provides a random mime type -exports.jscMimeTypes = function() { - return jsc.elements(mimeTypes); -}; - -// provides a random PrivateBin paste formatter -exports.jscFormats = function() { - return jsc.elements(formats); -}; - diff --git a/js/jquery-3.3.1.js b/js/jquery-3.3.1.js deleted file mode 100644 index 4d9b3a25..00000000 --- a/js/jquery-3.3.1.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! jQuery v3.3.1 | (c) JS Foundation and other contributors | jquery.org/license */ -!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(e,t){"use strict";var n=[],r=e.document,i=Object.getPrototypeOf,o=n.slice,a=n.concat,s=n.push,u=n.indexOf,l={},c=l.toString,f=l.hasOwnProperty,p=f.toString,d=p.call(Object),h={},g=function e(t){return"function"==typeof t&&"number"!=typeof t.nodeType},y=function e(t){return null!=t&&t===t.window},v={type:!0,src:!0,noModule:!0};function m(e,t,n){var i,o=(t=t||r).createElement("script");if(o.text=e,n)for(i in v)n[i]&&(o[i]=n[i]);t.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[c.call(e)]||"object":typeof e}var b="3.3.1",w=function(e,t){return new w.fn.init(e,t)},T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;w.fn=w.prototype={jquery:"3.3.1",constructor:w,length:0,toArray:function(){return o.call(this)},get:function(e){return null==e?o.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=w.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return w.each(this,e)},map:function(e){return this.pushStack(w.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(o.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n0&&t-1 in e)}var E=function(e){var t,n,r,i,o,a,s,u,l,c,f,p,d,h,g,y,v,m,x,b="sizzle"+1*new Date,w=e.document,T=0,C=0,E=ae(),k=ae(),S=ae(),D=function(e,t){return e===t&&(f=!0),0},N={}.hasOwnProperty,A=[],j=A.pop,q=A.push,L=A.push,H=A.slice,O=function(e,t){for(var n=0,r=e.length;n+~]|"+M+")"+M+"*"),z=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),X=new RegExp(W),U=new RegExp("^"+R+"$"),V={ID:new RegExp("^#("+R+")"),CLASS:new RegExp("^\\.("+R+")"),TAG:new RegExp("^("+R+"|[*])"),ATTR:new RegExp("^"+I),PSEUDO:new RegExp("^"+W),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+P+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},G=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Q=/^[^{]+\{\s*\[native \w/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,K=/[+~]/,Z=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ee=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},te=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ne=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},re=function(){p()},ie=me(function(e){return!0===e.disabled&&("form"in e||"label"in e)},{dir:"parentNode",next:"legend"});try{L.apply(A=H.call(w.childNodes),w.childNodes),A[w.childNodes.length].nodeType}catch(e){L={apply:A.length?function(e,t){q.apply(e,H.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function oe(e,t,r,i){var o,s,l,c,f,h,v,m=t&&t.ownerDocument,T=t?t.nodeType:9;if(r=r||[],"string"!=typeof e||!e||1!==T&&9!==T&&11!==T)return r;if(!i&&((t?t.ownerDocument||t:w)!==d&&p(t),t=t||d,g)){if(11!==T&&(f=J.exec(e)))if(o=f[1]){if(9===T){if(!(l=t.getElementById(o)))return r;if(l.id===o)return r.push(l),r}else if(m&&(l=m.getElementById(o))&&x(t,l)&&l.id===o)return r.push(l),r}else{if(f[2])return L.apply(r,t.getElementsByTagName(e)),r;if((o=f[3])&&n.getElementsByClassName&&t.getElementsByClassName)return L.apply(r,t.getElementsByClassName(o)),r}if(n.qsa&&!S[e+" "]&&(!y||!y.test(e))){if(1!==T)m=t,v=e;else if("object"!==t.nodeName.toLowerCase()){(c=t.getAttribute("id"))?c=c.replace(te,ne):t.setAttribute("id",c=b),s=(h=a(e)).length;while(s--)h[s]="#"+c+" "+ve(h[s]);v=h.join(","),m=K.test(e)&&ge(t.parentNode)||t}if(v)try{return L.apply(r,m.querySelectorAll(v)),r}catch(e){}finally{c===b&&t.removeAttribute("id")}}}return u(e.replace(B,"$1"),t,r,i)}function ae(){var e=[];function t(n,i){return e.push(n+" ")>r.cacheLength&&delete t[e.shift()],t[n+" "]=i}return t}function se(e){return e[b]=!0,e}function ue(e){var t=d.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function le(e,t){var n=e.split("|"),i=n.length;while(i--)r.attrHandle[n[i]]=t}function ce(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function fe(e){return function(t){return"input"===t.nodeName.toLowerCase()&&t.type===e}}function pe(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function de(e){return function(t){return"form"in t?t.parentNode&&!1===t.disabled?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&ie(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function he(e){return se(function(t){return t=+t,se(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function ge(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}n=oe.support={},o=oe.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},p=oe.setDocument=function(e){var t,i,a=e?e.ownerDocument||e:w;return a!==d&&9===a.nodeType&&a.documentElement?(d=a,h=d.documentElement,g=!o(d),w!==d&&(i=d.defaultView)&&i.top!==i&&(i.addEventListener?i.addEventListener("unload",re,!1):i.attachEvent&&i.attachEvent("onunload",re)),n.attributes=ue(function(e){return e.className="i",!e.getAttribute("className")}),n.getElementsByTagName=ue(function(e){return e.appendChild(d.createComment("")),!e.getElementsByTagName("*").length}),n.getElementsByClassName=Q.test(d.getElementsByClassName),n.getById=ue(function(e){return h.appendChild(e).id=b,!d.getElementsByName||!d.getElementsByName(b).length}),n.getById?(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){return e.getAttribute("id")===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n=t.getElementById(e);return n?[n]:[]}}):(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),r.find.TAG=n.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):n.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},r.find.CLASS=n.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&g)return t.getElementsByClassName(e)},v=[],y=[],(n.qsa=Q.test(d.querySelectorAll))&&(ue(function(e){h.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&y.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||y.push("\\["+M+"*(?:value|"+P+")"),e.querySelectorAll("[id~="+b+"-]").length||y.push("~="),e.querySelectorAll(":checked").length||y.push(":checked"),e.querySelectorAll("a#"+b+"+*").length||y.push(".#.+[+~]")}),ue(function(e){e.innerHTML="";var t=d.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&y.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&y.push(":enabled",":disabled"),h.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&y.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),y.push(",.*:")})),(n.matchesSelector=Q.test(m=h.matches||h.webkitMatchesSelector||h.mozMatchesSelector||h.oMatchesSelector||h.msMatchesSelector))&&ue(function(e){n.disconnectedMatch=m.call(e,"*"),m.call(e,"[s!='']:x"),v.push("!=",W)}),y=y.length&&new RegExp(y.join("|")),v=v.length&&new RegExp(v.join("|")),t=Q.test(h.compareDocumentPosition),x=t||Q.test(h.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return f=!0,0;var r=!e.compareDocumentPosition-!t.compareDocumentPosition;return r||(1&(r=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!n.sortDetached&&t.compareDocumentPosition(e)===r?e===d||e.ownerDocument===w&&x(w,e)?-1:t===d||t.ownerDocument===w&&x(w,t)?1:c?O(c,e)-O(c,t):0:4&r?-1:1)}:function(e,t){if(e===t)return f=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===d?-1:t===d?1:i?-1:o?1:c?O(c,e)-O(c,t):0;if(i===o)return ce(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?ce(a[r],s[r]):a[r]===w?-1:s[r]===w?1:0},d):d},oe.matches=function(e,t){return oe(e,null,null,t)},oe.matchesSelector=function(e,t){if((e.ownerDocument||e)!==d&&p(e),t=t.replace(z,"='$1']"),n.matchesSelector&&g&&!S[t+" "]&&(!v||!v.test(t))&&(!y||!y.test(t)))try{var r=m.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return oe(t,d,null,[e]).length>0},oe.contains=function(e,t){return(e.ownerDocument||e)!==d&&p(e),x(e,t)},oe.attr=function(e,t){(e.ownerDocument||e)!==d&&p(e);var i=r.attrHandle[t.toLowerCase()],o=i&&N.call(r.attrHandle,t.toLowerCase())?i(e,t,!g):void 0;return void 0!==o?o:n.attributes||!g?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null},oe.escape=function(e){return(e+"").replace(te,ne)},oe.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},oe.uniqueSort=function(e){var t,r=[],i=0,o=0;if(f=!n.detectDuplicates,c=!n.sortStable&&e.slice(0),e.sort(D),f){while(t=e[o++])t===e[o]&&(i=r.push(o));while(i--)e.splice(r[i],1)}return c=null,e},i=oe.getText=function(e){var t,n="",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=i(e)}else if(3===o||4===o)return e.nodeValue}else while(t=e[r++])n+=i(t);return n},(r=oe.selectors={cacheLength:50,createPseudo:se,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(Z,ee),e[3]=(e[3]||e[4]||e[5]||"").replace(Z,ee),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||oe.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&oe.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return V.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=a(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(Z,ee).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=E[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&E(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=oe.attr(r,e);return null==i?"!="===t:!t||(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i.replace($," ")+" ").indexOf(n)>-1:"|="===t&&(i===n||i.slice(0,n.length+1)===n+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,p,d,h,g=o!==a?"nextSibling":"previousSibling",y=t.parentNode,v=s&&t.nodeName.toLowerCase(),m=!u&&!s,x=!1;if(y){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===v:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?y.firstChild:y.lastChild],a&&m){x=(d=(l=(c=(f=(p=y)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1])&&l[2],p=d&&y.childNodes[d];while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if(1===p.nodeType&&++x&&p===t){c[e]=[T,d,x];break}}else if(m&&(x=d=(l=(c=(f=(p=t)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1]),!1===x)while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===v:1===p.nodeType)&&++x&&(m&&((c=(f=p[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]=[T,x]),p===t))break;return(x-=i)===r||x%r==0&&x/r>=0}}},PSEUDO:function(e,t){var n,i=r.pseudos[e]||r.setFilters[e.toLowerCase()]||oe.error("unsupported pseudo: "+e);return i[b]?i(t):i.length>1?(n=[e,e,"",t],r.setFilters.hasOwnProperty(e.toLowerCase())?se(function(e,n){var r,o=i(e,t),a=o.length;while(a--)e[r=O(e,o[a])]=!(n[r]=o[a])}):function(e){return i(e,0,n)}):i}},pseudos:{not:se(function(e){var t=[],n=[],r=s(e.replace(B,"$1"));return r[b]?se(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),t[0]=null,!n.pop()}}),has:se(function(e){return function(t){return oe(e,t).length>0}}),contains:se(function(e){return e=e.replace(Z,ee),function(t){return(t.textContent||t.innerText||i(t)).indexOf(e)>-1}}),lang:se(function(e){return U.test(e||"")||oe.error("unsupported lang: "+e),e=e.replace(Z,ee).toLowerCase(),function(t){var n;do{if(n=g?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return(n=n.toLowerCase())===e||0===n.indexOf(e+"-")}while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===h},focus:function(e){return e===d.activeElement&&(!d.hasFocus||d.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:de(!1),disabled:de(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!r.pseudos.empty(e)},header:function(e){return Y.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:he(function(){return[0]}),last:he(function(e,t){return[t-1]}),eq:he(function(e,t,n){return[n<0?n+t:n]}),even:he(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:he(function(e,t,n){for(var r=n<0?n+t:n;++r1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function be(e,t,n){for(var r=0,i=t.length;r-1&&(o[l]=!(a[l]=f))}}else v=we(v===a?v.splice(h,v.length):v),i?i(null,a,v,u):L.apply(a,v)})}function Ce(e){for(var t,n,i,o=e.length,a=r.relative[e[0].type],s=a||r.relative[" "],u=a?1:0,c=me(function(e){return e===t},s,!0),f=me(function(e){return O(t,e)>-1},s,!0),p=[function(e,n,r){var i=!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):f(e,n,r));return t=null,i}];u1&&xe(p),u>1&&ve(e.slice(0,u-1).concat({value:" "===e[u-2].type?"*":""})).replace(B,"$1"),n,u0,i=e.length>0,o=function(o,a,s,u,c){var f,h,y,v=0,m="0",x=o&&[],b=[],w=l,C=o||i&&r.find.TAG("*",c),E=T+=null==w?1:Math.random()||.1,k=C.length;for(c&&(l=a===d||a||c);m!==k&&null!=(f=C[m]);m++){if(i&&f){h=0,a||f.ownerDocument===d||(p(f),s=!g);while(y=e[h++])if(y(f,a||d,s)){u.push(f);break}c&&(T=E)}n&&((f=!y&&f)&&v--,o&&x.push(f))}if(v+=m,n&&m!==v){h=0;while(y=t[h++])y(x,b,a,s);if(o){if(v>0)while(m--)x[m]||b[m]||(b[m]=j.call(u));b=we(b)}L.apply(u,b),c&&!o&&b.length>0&&v+t.length>1&&oe.uniqueSort(u)}return c&&(T=E,l=w),x};return n?se(o):o}return s=oe.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=a(e)),n=t.length;while(n--)(o=Ce(t[n]))[b]?r.push(o):i.push(o);(o=S(e,Ee(i,r))).selector=e}return o},u=oe.select=function(e,t,n,i){var o,u,l,c,f,p="function"==typeof e&&e,d=!i&&a(e=p.selector||e);if(n=n||[],1===d.length){if((u=d[0]=d[0].slice(0)).length>2&&"ID"===(l=u[0]).type&&9===t.nodeType&&g&&r.relative[u[1].type]){if(!(t=(r.find.ID(l.matches[0].replace(Z,ee),t)||[])[0]))return n;p&&(t=t.parentNode),e=e.slice(u.shift().value.length)}o=V.needsContext.test(e)?0:u.length;while(o--){if(l=u[o],r.relative[c=l.type])break;if((f=r.find[c])&&(i=f(l.matches[0].replace(Z,ee),K.test(u[0].type)&&ge(t.parentNode)||t))){if(u.splice(o,1),!(e=i.length&&ve(u)))return L.apply(n,i),n;break}}}return(p||s(e,d))(i,t,!g,n,!t||K.test(e)&&ge(t.parentNode)||t),n},n.sortStable=b.split("").sort(D).join("")===b,n.detectDuplicates=!!f,p(),n.sortDetached=ue(function(e){return 1&e.compareDocumentPosition(d.createElement("fieldset"))}),ue(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||le("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),n.attributes&&ue(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||le("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ue(function(e){return null==e.getAttribute("disabled")})||le(P,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),oe}(e);w.find=E,w.expr=E.selectors,w.expr[":"]=w.expr.pseudos,w.uniqueSort=w.unique=E.uniqueSort,w.text=E.getText,w.isXMLDoc=E.isXML,w.contains=E.contains,w.escapeSelector=E.escape;var k=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&w(e).is(n))break;r.push(e)}return r},S=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},D=w.expr.match.needsContext;function N(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var A=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,t,n){return g(t)?w.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?w.grep(e,function(e){return e===t!==n}):"string"!=typeof t?w.grep(e,function(e){return u.call(t,e)>-1!==n}):w.filter(t,e,n)}w.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?w.find.matchesSelector(r,e)?[r]:[]:w.find.matches(e,w.grep(t,function(e){return 1===e.nodeType}))},w.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(w(e).filter(function(){for(t=0;t1?w.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&D.test(e)?w(e):e||[],!1).length}});var q,L=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(w.fn.init=function(e,t,n){var i,o;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(i="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:L.exec(e))||!i[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(i[1]){if(t=t instanceof w?t[0]:t,w.merge(this,w.parseHTML(i[1],t&&t.nodeType?t.ownerDocument||t:r,!0)),A.test(i[1])&&w.isPlainObject(t))for(i in t)g(this[i])?this[i](t[i]):this.attr(i,t[i]);return this}return(o=r.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):g(e)?void 0!==n.ready?n.ready(e):e(w):w.makeArray(e,this)}).prototype=w.fn,q=w(r);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};w.fn.extend({has:function(e){var t=w(e,this),n=t.length;return this.filter(function(){for(var e=0;e-1:1===n.nodeType&&w.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?w.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?u.call(w(e),this[0]):u.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(w.uniqueSort(w.merge(this.get(),w(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}w.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return k(e,"parentNode")},parentsUntil:function(e,t,n){return k(e,"parentNode",n)},next:function(e){return P(e,"nextSibling")},prev:function(e){return P(e,"previousSibling")},nextAll:function(e){return k(e,"nextSibling")},prevAll:function(e){return k(e,"previousSibling")},nextUntil:function(e,t,n){return k(e,"nextSibling",n)},prevUntil:function(e,t,n){return k(e,"previousSibling",n)},siblings:function(e){return S((e.parentNode||{}).firstChild,e)},children:function(e){return S(e.firstChild)},contents:function(e){return N(e,"iframe")?e.contentDocument:(N(e,"template")&&(e=e.content||e),w.merge([],e.childNodes))}},function(e,t){w.fn[e]=function(n,r){var i=w.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=w.filter(r,i)),this.length>1&&(O[e]||w.uniqueSort(i),H.test(e)&&i.reverse()),this.pushStack(i)}});var M=/[^\x20\t\r\n\f]+/g;function R(e){var t={};return w.each(e.match(M)||[],function(e,n){t[n]=!0}),t}w.Callbacks=function(e){e="string"==typeof e?R(e):w.extend({},e);var t,n,r,i,o=[],a=[],s=-1,u=function(){for(i=i||e.once,r=t=!0;a.length;s=-1){n=a.shift();while(++s-1)o.splice(n,1),n<=s&&s--}),this},has:function(e){return e?w.inArray(e,o)>-1:o.length>0},empty:function(){return o&&(o=[]),this},disable:function(){return i=a=[],o=n="",this},disabled:function(){return!o},lock:function(){return i=a=[],n||t||(o=n=""),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=[e,(n=n||[]).slice?n.slice():n],a.push(n),t||u()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l};function I(e){return e}function W(e){throw e}function $(e,t,n,r){var i;try{e&&g(i=e.promise)?i.call(e).done(t).fail(n):e&&g(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}w.extend({Deferred:function(t){var n=[["notify","progress",w.Callbacks("memory"),w.Callbacks("memory"),2],["resolve","done",w.Callbacks("once memory"),w.Callbacks("once memory"),0,"resolved"],["reject","fail",w.Callbacks("once memory"),w.Callbacks("once memory"),1,"rejected"]],r="pending",i={state:function(){return r},always:function(){return o.done(arguments).fail(arguments),this},"catch":function(e){return i.then(null,e)},pipe:function(){var e=arguments;return w.Deferred(function(t){w.each(n,function(n,r){var i=g(e[r[4]])&&e[r[4]];o[r[1]](function(){var e=i&&i.apply(this,arguments);e&&g(e.promise)?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[r[0]+"With"](this,i?[e]:arguments)})}),e=null}).promise()},then:function(t,r,i){var o=0;function a(t,n,r,i){return function(){var s=this,u=arguments,l=function(){var e,l;if(!(t=o&&(r!==W&&(s=void 0,u=[e]),n.rejectWith(s,u))}};t?c():(w.Deferred.getStackHook&&(c.stackTrace=w.Deferred.getStackHook()),e.setTimeout(c))}}return w.Deferred(function(e){n[0][3].add(a(0,e,g(i)?i:I,e.notifyWith)),n[1][3].add(a(0,e,g(t)?t:I)),n[2][3].add(a(0,e,g(r)?r:W))}).promise()},promise:function(e){return null!=e?w.extend(e,i):i}},o={};return w.each(n,function(e,t){var a=t[2],s=t[5];i[t[1]]=a.add,s&&a.add(function(){r=s},n[3-e][2].disable,n[3-e][3].disable,n[0][2].lock,n[0][3].lock),a.add(t[3].fire),o[t[0]]=function(){return o[t[0]+"With"](this===o?void 0:this,arguments),this},o[t[0]+"With"]=a.fireWith}),i.promise(o),t&&t.call(o,o),o},when:function(e){var t=arguments.length,n=t,r=Array(n),i=o.call(arguments),a=w.Deferred(),s=function(e){return function(n){r[e]=this,i[e]=arguments.length>1?o.call(arguments):n,--t||a.resolveWith(r,i)}};if(t<=1&&($(e,a.done(s(n)).resolve,a.reject,!t),"pending"===a.state()||g(i[n]&&i[n].then)))return a.then();while(n--)$(i[n],s(n),a.reject);return a.promise()}});var B=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;w.Deferred.exceptionHook=function(t,n){e.console&&e.console.warn&&t&&B.test(t.name)&&e.console.warn("jQuery.Deferred exception: "+t.message,t.stack,n)},w.readyException=function(t){e.setTimeout(function(){throw t})};var F=w.Deferred();w.fn.ready=function(e){return F.then(e)["catch"](function(e){w.readyException(e)}),this},w.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--w.readyWait:w.isReady)||(w.isReady=!0,!0!==e&&--w.readyWait>0||F.resolveWith(r,[w]))}}),w.ready.then=F.then;function _(){r.removeEventListener("DOMContentLoaded",_),e.removeEventListener("load",_),w.ready()}"complete"===r.readyState||"loading"!==r.readyState&&!r.documentElement.doScroll?e.setTimeout(w.ready):(r.addEventListener("DOMContentLoaded",_),e.addEventListener("load",_));var z=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===x(n)){i=!0;for(s in n)z(e,t,s,n[s],!0,o,a)}else if(void 0!==r&&(i=!0,g(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(w(e),n)})),t))for(;s1,null,!0)},removeData:function(e){return this.each(function(){K.remove(this,e)})}}),w.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=J.get(e,t),n&&(!r||Array.isArray(n)?r=J.access(e,t,w.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=w.queue(e,t),r=n.length,i=n.shift(),o=w._queueHooks(e,t),a=function(){w.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return J.get(e,n)||J.access(e,n,{empty:w.Callbacks("once memory").add(function(){J.remove(e,[t+"queue",n])})})}}),w.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length\x20\t\r\n\f]+)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ge.optgroup=ge.option,ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td;function ye(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&N(e,t)?w.merge([e],n):n}function ve(e,t){for(var n=0,r=e.length;n-1)i&&i.push(o);else if(l=w.contains(o.ownerDocument,o),a=ye(f.appendChild(o),"script"),l&&ve(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}!function(){var e=r.createDocumentFragment().appendChild(r.createElement("div")),t=r.createElement("input");t.setAttribute("type","radio"),t.setAttribute("checked","checked"),t.setAttribute("name","t"),e.appendChild(t),h.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,e.innerHTML="",h.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue}();var be=r.documentElement,we=/^key/,Te=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ce=/^([^.]*)(?:\.(.+)|)/;function Ee(){return!0}function ke(){return!1}function Se(){try{return r.activeElement}catch(e){}}function De(e,t,n,r,i,o){var a,s;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(s in t)De(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=ke;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return w().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=w.guid++)),e.each(function(){w.event.add(this,t,i,r,n)})}w.event={global:{},add:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.get(e);if(y){n.handler&&(n=(o=n).handler,i=o.selector),i&&w.find.matchesSelector(be,i),n.guid||(n.guid=w.guid++),(u=y.events)||(u=y.events={}),(a=y.handle)||(a=y.handle=function(t){return"undefined"!=typeof w&&w.event.triggered!==t.type?w.event.dispatch.apply(e,arguments):void 0}),l=(t=(t||"").match(M)||[""]).length;while(l--)d=g=(s=Ce.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=w.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=w.event.special[d]||{},c=w.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&w.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(e,r,h,a)||e.addEventListener&&e.addEventListener(d,a)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),w.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.hasData(e)&&J.get(e);if(y&&(u=y.events)){l=(t=(t||"").match(M)||[""]).length;while(l--)if(s=Ce.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){f=w.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,y.handle)||w.removeEvent(e,d,y.handle),delete u[d])}else for(d in u)w.event.remove(e,d+t[l],n,r,!0);w.isEmptyObject(u)&&J.remove(e,"handle events")}},dispatch:function(e){var t=w.event.fix(e),n,r,i,o,a,s,u=new Array(arguments.length),l=(J.get(this,"events")||{})[t.type]||[],c=w.event.special[t.type]||{};for(u[0]=t,n=1;n=1))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n-1:w.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u\x20\t\r\n\f]*)[^>]*)\/>/gi,Ae=/\s*$/g;function Le(e,t){return N(e,"table")&&N(11!==t.nodeType?t:t.firstChild,"tr")?w(e).children("tbody")[0]||e:e}function He(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Oe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Pe(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(J.hasData(e)&&(o=J.access(e),a=J.set(t,o),l=o.events)){delete a.handle,a.events={};for(i in l)for(n=0,r=l[i].length;n1&&"string"==typeof y&&!h.checkClone&&je.test(y))return e.each(function(i){var o=e.eq(i);v&&(t[0]=y.call(this,i,o.html())),Re(o,t,n,r)});if(p&&(i=xe(t,e[0].ownerDocument,!1,e,r),o=i.firstChild,1===i.childNodes.length&&(i=o),o||r)){for(u=(s=w.map(ye(i,"script"),He)).length;f")},clone:function(e,t,n){var r,i,o,a,s=e.cloneNode(!0),u=w.contains(e.ownerDocument,e);if(!(h.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||w.isXMLDoc(e)))for(a=ye(s),r=0,i=(o=ye(e)).length;r0&&ve(a,!u&&ye(e,"script")),s},cleanData:function(e){for(var t,n,r,i=w.event.special,o=0;void 0!==(n=e[o]);o++)if(Y(n)){if(t=n[J.expando]){if(t.events)for(r in t.events)i[r]?w.event.remove(n,r):w.removeEvent(n,r,t.handle);n[J.expando]=void 0}n[K.expando]&&(n[K.expando]=void 0)}}}),w.fn.extend({detach:function(e){return Ie(this,e,!0)},remove:function(e){return Ie(this,e)},text:function(e){return z(this,function(e){return void 0===e?w.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Re(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Le(this,e).appendChild(e)})},prepend:function(){return Re(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Le(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(w.cleanData(ye(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return w.clone(this,e,t)})},html:function(e){return z(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Ae.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=w.htmlPrefilter(e);try{for(;n=0&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))),u}function et(e,t,n){var r=$e(e),i=Fe(e,t,r),o="border-box"===w.css(e,"boxSizing",!1,r),a=o;if(We.test(i)){if(!n)return i;i="auto"}return a=a&&(h.boxSizingReliable()||i===e.style[t]),("auto"===i||!parseFloat(i)&&"inline"===w.css(e,"display",!1,r))&&(i=e["offset"+t[0].toUpperCase()+t.slice(1)],a=!0),(i=parseFloat(i)||0)+Ze(e,t,n||(o?"border":"content"),a,r,i)+"px"}w.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Fe(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=G(t),u=Xe.test(t),l=e.style;if(u||(t=Je(s)),a=w.cssHooks[t]||w.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"==(o=typeof n)&&(i=ie.exec(n))&&i[1]&&(n=ue(e,t,i),o="number"),null!=n&&n===n&&("number"===o&&(n+=i&&i[3]||(w.cssNumber[s]?"":"px")),h.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=G(t);return Xe.test(t)||(t=Je(s)),(a=w.cssHooks[t]||w.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Fe(e,t,r)),"normal"===i&&t in Ve&&(i=Ve[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),w.each(["height","width"],function(e,t){w.cssHooks[t]={get:function(e,n,r){if(n)return!ze.test(w.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?et(e,t,r):se(e,Ue,function(){return et(e,t,r)})},set:function(e,n,r){var i,o=$e(e),a="border-box"===w.css(e,"boxSizing",!1,o),s=r&&Ze(e,t,r,a,o);return a&&h.scrollboxSize()===o.position&&(s-=Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-parseFloat(o[t])-Ze(e,t,"border",!1,o)-.5)),s&&(i=ie.exec(n))&&"px"!==(i[3]||"px")&&(e.style[t]=n,n=w.css(e,t)),Ke(e,n,s)}}}),w.cssHooks.marginLeft=_e(h.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Fe(e,"marginLeft"))||e.getBoundingClientRect().left-se(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),w.each({margin:"",padding:"",border:"Width"},function(e,t){w.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+oe[r]+t]=o[r]||o[r-2]||o[0];return i}},"margin"!==e&&(w.cssHooks[e+t].set=Ke)}),w.fn.extend({css:function(e,t){return z(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=$e(e),i=t.length;a1)}});function tt(e,t,n,r,i){return new tt.prototype.init(e,t,n,r,i)}w.Tween=tt,tt.prototype={constructor:tt,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||w.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(w.cssNumber[n]?"":"px")},cur:function(){var e=tt.propHooks[this.prop];return e&&e.get?e.get(this):tt.propHooks._default.get(this)},run:function(e){var t,n=tt.propHooks[this.prop];return this.options.duration?this.pos=t=w.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):tt.propHooks._default.set(this),this}},tt.prototype.init.prototype=tt.prototype,tt.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=w.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){w.fx.step[e.prop]?w.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[w.cssProps[e.prop]]&&!w.cssHooks[e.prop]?e.elem[e.prop]=e.now:w.style(e.elem,e.prop,e.now+e.unit)}}},tt.propHooks.scrollTop=tt.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},w.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},w.fx=tt.prototype.init,w.fx.step={};var nt,rt,it=/^(?:toggle|show|hide)$/,ot=/queueHooks$/;function at(){rt&&(!1===r.hidden&&e.requestAnimationFrame?e.requestAnimationFrame(at):e.setTimeout(at,w.fx.interval),w.fx.tick())}function st(){return e.setTimeout(function(){nt=void 0}),nt=Date.now()}function ut(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=oe[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function lt(e,t,n){for(var r,i=(pt.tweeners[t]||[]).concat(pt.tweeners["*"]),o=0,a=i.length;o1)},removeAttr:function(e){return this.each(function(){w.removeAttr(this,e)})}}),w.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?w.prop(e,t,n):(1===o&&w.isXMLDoc(e)||(i=w.attrHooks[t.toLowerCase()]||(w.expr.match.bool.test(t)?dt:void 0)),void 0!==n?null===n?void w.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=w.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!h.radioValue&&"radio"===t&&N(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(M);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),dt={set:function(e,t,n){return!1===t?w.removeAttr(e,n):e.setAttribute(n,n),n}},w.each(w.expr.match.bool.source.match(/\w+/g),function(e,t){var n=ht[t]||w.find.attr;ht[t]=function(e,t,r){var i,o,a=t.toLowerCase();return r||(o=ht[a],ht[a]=i,i=null!=n(e,t,r)?a:null,ht[a]=o),i}});var gt=/^(?:input|select|textarea|button)$/i,yt=/^(?:a|area)$/i;w.fn.extend({prop:function(e,t){return z(this,w.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[w.propFix[e]||e]})}}),w.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&w.isXMLDoc(e)||(t=w.propFix[t]||t,i=w.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=w.find.attr(e,"tabindex");return t?parseInt(t,10):gt.test(e.nodeName)||yt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),h.optSelected||(w.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),w.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){w.propFix[this.toLowerCase()]=this});function vt(e){return(e.match(M)||[]).join(" ")}function mt(e){return e.getAttribute&&e.getAttribute("class")||""}function xt(e){return Array.isArray(e)?e:"string"==typeof e?e.match(M)||[]:[]}w.fn.extend({addClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).addClass(e.call(this,t,mt(this)))});if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},removeClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).removeClass(e.call(this,t,mt(this)))});if(!arguments.length)return this.attr("class","");if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])while(r.indexOf(" "+o+" ")>-1)r=r.replace(" "+o+" "," ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(e,t){var n=typeof e,r="string"===n||Array.isArray(e);return"boolean"==typeof t&&r?t?this.addClass(e):this.removeClass(e):g(e)?this.each(function(n){w(this).toggleClass(e.call(this,n,mt(this),t),t)}):this.each(function(){var t,i,o,a;if(r){i=0,o=w(this),a=xt(e);while(t=a[i++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else void 0!==e&&"boolean"!==n||((t=mt(this))&&J.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||!1===e?"":J.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&(" "+vt(mt(n))+" ").indexOf(t)>-1)return!0;return!1}});var bt=/\r/g;w.fn.extend({val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=g(e),this.each(function(n){var i;1===this.nodeType&&(null==(i=r?e.call(this,n,w(this).val()):e)?i="":"number"==typeof i?i+="":Array.isArray(i)&&(i=w.map(i,function(e){return null==e?"":e+""})),(t=w.valHooks[this.type]||w.valHooks[this.nodeName.toLowerCase()])&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))});if(i)return(t=w.valHooks[i.type]||w.valHooks[i.nodeName.toLowerCase()])&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:"string"==typeof(n=i.value)?n.replace(bt,""):null==n?"":n}}}),w.extend({valHooks:{option:{get:function(e){var t=w.find.attr(e,"value");return null!=t?t:vt(w.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r-1)&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),w.each(["radio","checkbox"],function(){w.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=w.inArray(w(e).val(),t)>-1}},h.checkOn||(w.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),h.focusin="onfocusin"in e;var wt=/^(?:focusinfocus|focusoutblur)$/,Tt=function(e){e.stopPropagation()};w.extend(w.event,{trigger:function(t,n,i,o){var a,s,u,l,c,p,d,h,v=[i||r],m=f.call(t,"type")?t.type:t,x=f.call(t,"namespace")?t.namespace.split("."):[];if(s=h=u=i=i||r,3!==i.nodeType&&8!==i.nodeType&&!wt.test(m+w.event.triggered)&&(m.indexOf(".")>-1&&(m=(x=m.split(".")).shift(),x.sort()),c=m.indexOf(":")<0&&"on"+m,t=t[w.expando]?t:new w.Event(m,"object"==typeof t&&t),t.isTrigger=o?2:3,t.namespace=x.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+x.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=i),n=null==n?[t]:w.makeArray(n,[t]),d=w.event.special[m]||{},o||!d.trigger||!1!==d.trigger.apply(i,n))){if(!o&&!d.noBubble&&!y(i)){for(l=d.delegateType||m,wt.test(l+m)||(s=s.parentNode);s;s=s.parentNode)v.push(s),u=s;u===(i.ownerDocument||r)&&v.push(u.defaultView||u.parentWindow||e)}a=0;while((s=v[a++])&&!t.isPropagationStopped())h=s,t.type=a>1?l:d.bindType||m,(p=(J.get(s,"events")||{})[t.type]&&J.get(s,"handle"))&&p.apply(s,n),(p=c&&s[c])&&p.apply&&Y(s)&&(t.result=p.apply(s,n),!1===t.result&&t.preventDefault());return t.type=m,o||t.isDefaultPrevented()||d._default&&!1!==d._default.apply(v.pop(),n)||!Y(i)||c&&g(i[m])&&!y(i)&&((u=i[c])&&(i[c]=null),w.event.triggered=m,t.isPropagationStopped()&&h.addEventListener(m,Tt),i[m](),t.isPropagationStopped()&&h.removeEventListener(m,Tt),w.event.triggered=void 0,u&&(i[c]=u)),t.result}},simulate:function(e,t,n){var r=w.extend(new w.Event,n,{type:e,isSimulated:!0});w.event.trigger(r,null,t)}}),w.fn.extend({trigger:function(e,t){return this.each(function(){w.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return w.event.trigger(e,t,n,!0)}}),h.focusin||w.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){w.event.simulate(t,e.target,w.event.fix(e))};w.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=J.access(r,t);i||r.addEventListener(e,n,!0),J.access(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=J.access(r,t)-1;i?J.access(r,t,i):(r.removeEventListener(e,n,!0),J.remove(r,t))}}});var Ct=e.location,Et=Date.now(),kt=/\?/;w.parseXML=function(t){var n;if(!t||"string"!=typeof t)return null;try{n=(new e.DOMParser).parseFromString(t,"text/xml")}catch(e){n=void 0}return n&&!n.getElementsByTagName("parsererror").length||w.error("Invalid XML: "+t),n};var St=/\[\]$/,Dt=/\r?\n/g,Nt=/^(?:submit|button|image|reset|file)$/i,At=/^(?:input|select|textarea|keygen)/i;function jt(e,t,n,r){var i;if(Array.isArray(t))w.each(t,function(t,i){n||St.test(e)?r(e,i):jt(e+"["+("object"==typeof i&&null!=i?t:"")+"]",i,n,r)});else if(n||"object"!==x(t))r(e,t);else for(i in t)jt(e+"["+i+"]",t[i],n,r)}w.param=function(e,t){var n,r=[],i=function(e,t){var n=g(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(Array.isArray(e)||e.jquery&&!w.isPlainObject(e))w.each(e,function(){i(this.name,this.value)});else for(n in e)jt(n,e[n],t,i);return r.join("&")},w.fn.extend({serialize:function(){return w.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=w.prop(this,"elements");return e?w.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!w(this).is(":disabled")&&At.test(this.nodeName)&&!Nt.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=w(this).val();return null==n?null:Array.isArray(n)?w.map(n,function(e){return{name:t.name,value:e.replace(Dt,"\r\n")}}):{name:t.name,value:n.replace(Dt,"\r\n")}}).get()}});var qt=/%20/g,Lt=/#.*$/,Ht=/([?&])_=[^&]*/,Ot=/^(.*?):[ \t]*([^\r\n]*)$/gm,Pt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Mt=/^(?:GET|HEAD)$/,Rt=/^\/\//,It={},Wt={},$t="*/".concat("*"),Bt=r.createElement("a");Bt.href=Ct.href;function Ft(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(M)||[];if(g(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function _t(e,t,n,r){var i={},o=e===Wt;function a(s){var u;return i[s]=!0,w.each(e[s]||[],function(e,s){var l=s(t,n,r);return"string"!=typeof l||o||i[l]?o?!(u=l):void 0:(t.dataTypes.unshift(l),a(l),!1)}),u}return a(t.dataTypes[0])||!i["*"]&&a("*")}function zt(e,t){var n,r,i=w.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&w.extend(!0,e,r),e}function Xt(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}function Ut(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}w.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ct.href,type:"GET",isLocal:Pt.test(Ct.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":$t,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":w.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?zt(zt(e,w.ajaxSettings),t):zt(w.ajaxSettings,e)},ajaxPrefilter:Ft(It),ajaxTransport:Ft(Wt),ajax:function(t,n){"object"==typeof t&&(n=t,t=void 0),n=n||{};var i,o,a,s,u,l,c,f,p,d,h=w.ajaxSetup({},n),g=h.context||h,y=h.context&&(g.nodeType||g.jquery)?w(g):w.event,v=w.Deferred(),m=w.Callbacks("once memory"),x=h.statusCode||{},b={},T={},C="canceled",E={readyState:0,getResponseHeader:function(e){var t;if(c){if(!s){s={};while(t=Ot.exec(a))s[t[1].toLowerCase()]=t[2]}t=s[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return c?a:null},setRequestHeader:function(e,t){return null==c&&(e=T[e.toLowerCase()]=T[e.toLowerCase()]||e,b[e]=t),this},overrideMimeType:function(e){return null==c&&(h.mimeType=e),this},statusCode:function(e){var t;if(e)if(c)E.always(e[E.status]);else for(t in e)x[t]=[x[t],e[t]];return this},abort:function(e){var t=e||C;return i&&i.abort(t),k(0,t),this}};if(v.promise(E),h.url=((t||h.url||Ct.href)+"").replace(Rt,Ct.protocol+"//"),h.type=n.method||n.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(M)||[""],null==h.crossDomain){l=r.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Bt.protocol+"//"+Bt.host!=l.protocol+"//"+l.host}catch(e){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=w.param(h.data,h.traditional)),_t(It,h,n,E),c)return E;(f=w.event&&h.global)&&0==w.active++&&w.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Mt.test(h.type),o=h.url.replace(Lt,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(qt,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(kt.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Ht,"$1"),d=(kt.test(o)?"&":"?")+"_="+Et+++d),h.url=o+d),h.ifModified&&(w.lastModified[o]&&E.setRequestHeader("If-Modified-Since",w.lastModified[o]),w.etag[o]&&E.setRequestHeader("If-None-Match",w.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||n.contentType)&&E.setRequestHeader("Content-Type",h.contentType),E.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+$t+"; q=0.01":""):h.accepts["*"]);for(p in h.headers)E.setRequestHeader(p,h.headers[p]);if(h.beforeSend&&(!1===h.beforeSend.call(g,E,h)||c))return E.abort();if(C="abort",m.add(h.complete),E.done(h.success),E.fail(h.error),i=_t(Wt,h,n,E)){if(E.readyState=1,f&&y.trigger("ajaxSend",[E,h]),c)return E;h.async&&h.timeout>0&&(u=e.setTimeout(function(){E.abort("timeout")},h.timeout));try{c=!1,i.send(b,k)}catch(e){if(c)throw e;k(-1,e)}}else k(-1,"No Transport");function k(t,n,r,s){var l,p,d,b,T,C=n;c||(c=!0,u&&e.clearTimeout(u),i=void 0,a=s||"",E.readyState=t>0?4:0,l=t>=200&&t<300||304===t,r&&(b=Xt(h,E,r)),b=Ut(h,b,E,l),l?(h.ifModified&&((T=E.getResponseHeader("Last-Modified"))&&(w.lastModified[o]=T),(T=E.getResponseHeader("etag"))&&(w.etag[o]=T)),204===t||"HEAD"===h.type?C="nocontent":304===t?C="notmodified":(C=b.state,p=b.data,l=!(d=b.error))):(d=C,!t&&C||(C="error",t<0&&(t=0))),E.status=t,E.statusText=(n||C)+"",l?v.resolveWith(g,[p,C,E]):v.rejectWith(g,[E,C,d]),E.statusCode(x),x=void 0,f&&y.trigger(l?"ajaxSuccess":"ajaxError",[E,h,l?p:d]),m.fireWith(g,[E,C]),f&&(y.trigger("ajaxComplete",[E,h]),--w.active||w.event.trigger("ajaxStop")))}return E},getJSON:function(e,t,n){return w.get(e,t,n,"json")},getScript:function(e,t){return w.get(e,void 0,t,"script")}}),w.each(["get","post"],function(e,t){w[t]=function(e,n,r,i){return g(n)&&(i=i||r,r=n,n=void 0),w.ajax(w.extend({url:e,type:t,dataType:i,data:n,success:r},w.isPlainObject(e)&&e))}}),w._evalUrl=function(e){return w.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},w.fn.extend({wrapAll:function(e){var t;return this[0]&&(g(e)&&(e=e.call(this[0])),t=w(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return g(e)?this.each(function(t){w(this).wrapInner(e.call(this,t))}):this.each(function(){var t=w(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=g(e);return this.each(function(n){w(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not("body").each(function(){w(this).replaceWith(this.childNodes)}),this}}),w.expr.pseudos.hidden=function(e){return!w.expr.pseudos.visible(e)},w.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},w.ajaxSettings.xhr=function(){try{return new e.XMLHttpRequest}catch(e){}};var Vt={0:200,1223:204},Gt=w.ajaxSettings.xhr();h.cors=!!Gt&&"withCredentials"in Gt,h.ajax=Gt=!!Gt,w.ajaxTransport(function(t){var n,r;if(h.cors||Gt&&!t.crossDomain)return{send:function(i,o){var a,s=t.xhr();if(s.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(a in t.xhrFields)s[a]=t.xhrFields[a];t.mimeType&&s.overrideMimeType&&s.overrideMimeType(t.mimeType),t.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");for(a in i)s.setRequestHeader(a,i[a]);n=function(e){return function(){n&&(n=r=s.onload=s.onerror=s.onabort=s.ontimeout=s.onreadystatechange=null,"abort"===e?s.abort():"error"===e?"number"!=typeof s.status?o(0,"error"):o(s.status,s.statusText):o(Vt[s.status]||s.status,s.statusText,"text"!==(s.responseType||"text")||"string"!=typeof s.responseText?{binary:s.response}:{text:s.responseText},s.getAllResponseHeaders()))}},s.onload=n(),r=s.onerror=s.ontimeout=n("error"),void 0!==s.onabort?s.onabort=r:s.onreadystatechange=function(){4===s.readyState&&e.setTimeout(function(){n&&r()})},n=n("abort");try{s.send(t.hasContent&&t.data||null)}catch(e){if(n)throw e}},abort:function(){n&&n()}}}),w.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),w.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return w.globalEval(e),e}}}),w.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),w.ajaxTransport("script",function(e){if(e.crossDomain){var t,n;return{send:function(i,o){t=w(" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - class="navbar-spacing"> - - - - - -
- - - - - diff --git a/tpl/page.php b/tpl/page.php deleted file mode 100644 index ea09be00..00000000 --- a/tpl/page.php +++ /dev/null @@ -1,259 +0,0 @@ - - - - - - - <?php echo I18n::_($NAME); ?> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- in the browser using 256 bits AES. More information on the project page.', I18n::_($NAME)); ?>
- - -
-


-


-

- -
-
- Firefox, - Opera, - Chrome… -
-
-
-
- -
- -
- - - - - - - - - - - - - - - - - - -
- -
- -
- -
- - - - - - - - - - -
-
-
- -
- - - -
- -
- - diff --git a/vendor/.htaccess b/vendor/.htaccess deleted file mode 100644 index b66e8088..00000000 --- a/vendor/.htaccess +++ /dev/null @@ -1 +0,0 @@ -Require all denied diff --git a/vendor/autoload.php b/vendor/autoload.php deleted file mode 100644 index a1be3bcf..00000000 --- a/vendor/autoload.php +++ /dev/null @@ -1,7 +0,0 @@ - - * Jordi Boggiano - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Composer\Autoload; - -/** - * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. - * - * $loader = new \Composer\Autoload\ClassLoader(); - * - * // register classes with namespaces - * $loader->add('Symfony\Component', __DIR__.'/component'); - * $loader->add('Symfony', __DIR__.'/framework'); - * - * // activate the autoloader - * $loader->register(); - * - * // to enable searching the include path (eg. for PEAR packages) - * $loader->setUseIncludePath(true); - * - * In this example, if you try to use a class in the Symfony\Component - * namespace or one of its children (Symfony\Component\Console for instance), - * the autoloader will first look for the class under the component/ - * directory, and it will then fallback to the framework/ directory if not - * found before giving up. - * - * This class is loosely based on the Symfony UniversalClassLoader. - * - * @author Fabien Potencier - * @author Jordi Boggiano - * @see http://www.php-fig.org/psr/psr-0/ - * @see http://www.php-fig.org/psr/psr-4/ - */ -class ClassLoader -{ - // PSR-4 - private $prefixLengthsPsr4 = array(); - private $prefixDirsPsr4 = array(); - private $fallbackDirsPsr4 = array(); - - // PSR-0 - private $prefixesPsr0 = array(); - private $fallbackDirsPsr0 = array(); - - private $useIncludePath = false; - private $classMap = array(); - private $classMapAuthoritative = false; - private $missingClasses = array(); - private $apcuPrefix; - - public function getPrefixes() - { - if (!empty($this->prefixesPsr0)) { - return call_user_func_array('array_merge', $this->prefixesPsr0); - } - - return array(); - } - - public function getPrefixesPsr4() - { - return $this->prefixDirsPsr4; - } - - public function getFallbackDirs() - { - return $this->fallbackDirsPsr0; - } - - public function getFallbackDirsPsr4() - { - return $this->fallbackDirsPsr4; - } - - public function getClassMap() - { - return $this->classMap; - } - - /** - * @param array $classMap Class to filename map - */ - public function addClassMap(array $classMap) - { - if ($this->classMap) { - $this->classMap = array_merge($this->classMap, $classMap); - } else { - $this->classMap = $classMap; - } - } - - /** - * Registers a set of PSR-0 directories for a given prefix, either - * appending or prepending to the ones previously set for this prefix. - * - * @param string $prefix The prefix - * @param array|string $paths The PSR-0 root directories - * @param bool $prepend Whether to prepend the directories - */ - public function add($prefix, $paths, $prepend = false) - { - if (!$prefix) { - if ($prepend) { - $this->fallbackDirsPsr0 = array_merge( - (array) $paths, - $this->fallbackDirsPsr0 - ); - } else { - $this->fallbackDirsPsr0 = array_merge( - $this->fallbackDirsPsr0, - (array) $paths - ); - } - - return; - } - - $first = $prefix[0]; - if (!isset($this->prefixesPsr0[$first][$prefix])) { - $this->prefixesPsr0[$first][$prefix] = (array) $paths; - - return; - } - if ($prepend) { - $this->prefixesPsr0[$first][$prefix] = array_merge( - (array) $paths, - $this->prefixesPsr0[$first][$prefix] - ); - } else { - $this->prefixesPsr0[$first][$prefix] = array_merge( - $this->prefixesPsr0[$first][$prefix], - (array) $paths - ); - } - } - - /** - * Registers a set of PSR-4 directories for a given namespace, either - * appending or prepending to the ones previously set for this namespace. - * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param array|string $paths The PSR-4 base directories - * @param bool $prepend Whether to prepend the directories - * - * @throws \InvalidArgumentException - */ - public function addPsr4($prefix, $paths, $prepend = false) - { - if (!$prefix) { - // Register directories for the root namespace. - if ($prepend) { - $this->fallbackDirsPsr4 = array_merge( - (array) $paths, - $this->fallbackDirsPsr4 - ); - } else { - $this->fallbackDirsPsr4 = array_merge( - $this->fallbackDirsPsr4, - (array) $paths - ); - } - } elseif (!isset($this->prefixDirsPsr4[$prefix])) { - // Register directories for a new namespace. - $length = strlen($prefix); - if ('\\' !== $prefix[$length - 1]) { - throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); - } - $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; - $this->prefixDirsPsr4[$prefix] = (array) $paths; - } elseif ($prepend) { - // Prepend directories for an already registered namespace. - $this->prefixDirsPsr4[$prefix] = array_merge( - (array) $paths, - $this->prefixDirsPsr4[$prefix] - ); - } else { - // Append directories for an already registered namespace. - $this->prefixDirsPsr4[$prefix] = array_merge( - $this->prefixDirsPsr4[$prefix], - (array) $paths - ); - } - } - - /** - * Registers a set of PSR-0 directories for a given prefix, - * replacing any others previously set for this prefix. - * - * @param string $prefix The prefix - * @param array|string $paths The PSR-0 base directories - */ - public function set($prefix, $paths) - { - if (!$prefix) { - $this->fallbackDirsPsr0 = (array) $paths; - } else { - $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; - } - } - - /** - * Registers a set of PSR-4 directories for a given namespace, - * replacing any others previously set for this namespace. - * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param array|string $paths The PSR-4 base directories - * - * @throws \InvalidArgumentException - */ - public function setPsr4($prefix, $paths) - { - if (!$prefix) { - $this->fallbackDirsPsr4 = (array) $paths; - } else { - $length = strlen($prefix); - if ('\\' !== $prefix[$length - 1]) { - throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); - } - $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; - $this->prefixDirsPsr4[$prefix] = (array) $paths; - } - } - - /** - * Turns on searching the include path for class files. - * - * @param bool $useIncludePath - */ - public function setUseIncludePath($useIncludePath) - { - $this->useIncludePath = $useIncludePath; - } - - /** - * Can be used to check if the autoloader uses the include path to check - * for classes. - * - * @return bool - */ - public function getUseIncludePath() - { - return $this->useIncludePath; - } - - /** - * Turns off searching the prefix and fallback directories for classes - * that have not been registered with the class map. - * - * @param bool $classMapAuthoritative - */ - public function setClassMapAuthoritative($classMapAuthoritative) - { - $this->classMapAuthoritative = $classMapAuthoritative; - } - - /** - * Should class lookup fail if not found in the current class map? - * - * @return bool - */ - public function isClassMapAuthoritative() - { - return $this->classMapAuthoritative; - } - - /** - * APCu prefix to use to cache found/not-found classes, if the extension is enabled. - * - * @param string|null $apcuPrefix - */ - public function setApcuPrefix($apcuPrefix) - { - $this->apcuPrefix = function_exists('apcu_fetch') && ini_get('apc.enabled') ? $apcuPrefix : null; - } - - /** - * The APCu prefix in use, or null if APCu caching is not enabled. - * - * @return string|null - */ - public function getApcuPrefix() - { - return $this->apcuPrefix; - } - - /** - * Registers this instance as an autoloader. - * - * @param bool $prepend Whether to prepend the autoloader or not - */ - public function register($prepend = false) - { - spl_autoload_register(array($this, 'loadClass'), true, $prepend); - } - - /** - * Unregisters this instance as an autoloader. - */ - public function unregister() - { - spl_autoload_unregister(array($this, 'loadClass')); - } - - /** - * Loads the given class or interface. - * - * @param string $class The name of the class - * @return bool|null True if loaded, null otherwise - */ - public function loadClass($class) - { - if ($file = $this->findFile($class)) { - includeFile($file); - - return true; - } - } - - /** - * Finds the path to the file where the class is defined. - * - * @param string $class The name of the class - * - * @return string|false The path if found, false otherwise - */ - public function findFile($class) - { - // class map lookup - if (isset($this->classMap[$class])) { - return $this->classMap[$class]; - } - if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { - return false; - } - if (null !== $this->apcuPrefix) { - $file = apcu_fetch($this->apcuPrefix.$class, $hit); - if ($hit) { - return $file; - } - } - - $file = $this->findFileWithExtension($class, '.php'); - - // Search for Hack files if we are running on HHVM - if (false === $file && defined('HHVM_VERSION')) { - $file = $this->findFileWithExtension($class, '.hh'); - } - - if (null !== $this->apcuPrefix) { - apcu_add($this->apcuPrefix.$class, $file); - } - - if (false === $file) { - // Remember that this class does not exist. - $this->missingClasses[$class] = true; - } - - return $file; - } - - private function findFileWithExtension($class, $ext) - { - // PSR-4 lookup - $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; - - $first = $class[0]; - if (isset($this->prefixLengthsPsr4[$first])) { - $subPath = $class; - while (false !== $lastPos = strrpos($subPath, '\\')) { - $subPath = substr($subPath, 0, $lastPos); - $search = $subPath.'\\'; - if (isset($this->prefixDirsPsr4[$search])) { - $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); - foreach ($this->prefixDirsPsr4[$search] as $dir) { - if (file_exists($file = $dir . $pathEnd)) { - return $file; - } - } - } - } - } - - // PSR-4 fallback dirs - foreach ($this->fallbackDirsPsr4 as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { - return $file; - } - } - - // PSR-0 lookup - if (false !== $pos = strrpos($class, '\\')) { - // namespaced class name - $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) - . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); - } else { - // PEAR-like class name - $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; - } - - if (isset($this->prefixesPsr0[$first])) { - foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { - if (0 === strpos($class, $prefix)) { - foreach ($dirs as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { - return $file; - } - } - } - } - } - - // PSR-0 fallback dirs - foreach ($this->fallbackDirsPsr0 as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { - return $file; - } - } - - // PSR-0 include paths. - if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { - return $file; - } - - return false; - } -} - -/** - * Scope isolated include. - * - * Prevents access to $this/self from included files. - */ -function includeFile($file) -{ - include $file; -} diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php deleted file mode 100644 index 2a560ae6..00000000 --- a/vendor/composer/autoload_classmap.php +++ /dev/null @@ -1,35 +0,0 @@ - $vendorDir . '/yzalis/identicon/src/Identicon/Generator/BaseGenerator.php', - 'Identicon\\Generator\\GdGenerator' => $vendorDir . '/yzalis/identicon/src/Identicon/Generator/GdGenerator.php', - 'Identicon\\Generator\\GeneratorInterface' => $vendorDir . '/yzalis/identicon/src/Identicon/Generator/GeneratorInterface.php', - 'Identicon\\Generator\\ImageMagickGenerator' => $vendorDir . '/yzalis/identicon/src/Identicon/Generator/ImageMagickGenerator.php', - 'Identicon\\Identicon' => $vendorDir . '/yzalis/identicon/src/Identicon/Identicon.php', - 'PrivateBin\\Configuration' => $baseDir . '/lib/Configuration.php', - 'PrivateBin\\Controller' => $baseDir . '/lib/Controller.php', - 'PrivateBin\\Data\\AbstractData' => $baseDir . '/lib/Data/AbstractData.php', - 'PrivateBin\\Data\\Database' => $baseDir . '/lib/Data/Database.php', - 'PrivateBin\\Data\\Filesystem' => $baseDir . '/lib/Data/Filesystem.php', - 'PrivateBin\\Filter' => $baseDir . '/lib/Filter.php', - 'PrivateBin\\I18n' => $baseDir . '/lib/I18n.php', - 'PrivateBin\\Json' => $baseDir . '/lib/Json.php', - 'PrivateBin\\Model' => $baseDir . '/lib/Model.php', - 'PrivateBin\\Model\\AbstractModel' => $baseDir . '/lib/Model/AbstractModel.php', - 'PrivateBin\\Model\\Comment' => $baseDir . '/lib/Model/Comment.php', - 'PrivateBin\\Model\\Paste' => $baseDir . '/lib/Model/Paste.php', - 'PrivateBin\\Persistence\\AbstractPersistence' => $baseDir . '/lib/Persistence/AbstractPersistence.php', - 'PrivateBin\\Persistence\\DataStore' => $baseDir . '/lib/Persistence/DataStore.php', - 'PrivateBin\\Persistence\\PurgeLimiter' => $baseDir . '/lib/Persistence/PurgeLimiter.php', - 'PrivateBin\\Persistence\\ServerSalt' => $baseDir . '/lib/Persistence/ServerSalt.php', - 'PrivateBin\\Persistence\\TrafficLimiter' => $baseDir . '/lib/Persistence/TrafficLimiter.php', - 'PrivateBin\\Request' => $baseDir . '/lib/Request.php', - 'PrivateBin\\Sjcl' => $baseDir . '/lib/Sjcl.php', - 'PrivateBin\\View' => $baseDir . '/lib/View.php', - 'PrivateBin\\Vizhash16x16' => $baseDir . '/lib/Vizhash16x16.php', -); diff --git a/vendor/composer/autoload_files.php b/vendor/composer/autoload_files.php deleted file mode 100644 index 4d80bcb5..00000000 --- a/vendor/composer/autoload_files.php +++ /dev/null @@ -1,10 +0,0 @@ - $vendorDir . '/paragonie/random_compat/lib/random.php', -); diff --git a/vendor/composer/autoload_namespaces.php b/vendor/composer/autoload_namespaces.php deleted file mode 100644 index 4034081f..00000000 --- a/vendor/composer/autoload_namespaces.php +++ /dev/null @@ -1,10 +0,0 @@ - array($vendorDir . '/yzalis/identicon/src'), -); diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php deleted file mode 100644 index 26f0cedc..00000000 --- a/vendor/composer/autoload_psr4.php +++ /dev/null @@ -1,10 +0,0 @@ - array($baseDir . '/lib'), -); diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php deleted file mode 100644 index 2e234b96..00000000 --- a/vendor/composer/autoload_real.php +++ /dev/null @@ -1,70 +0,0 @@ -= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); - if ($useStaticLoader) { - require_once __DIR__ . '/autoload_static.php'; - - call_user_func(\Composer\Autoload\ComposerStaticInitDontChange::getInitializer($loader)); - } else { - $map = require __DIR__ . '/autoload_namespaces.php'; - foreach ($map as $namespace => $path) { - $loader->set($namespace, $path); - } - - $map = require __DIR__ . '/autoload_psr4.php'; - foreach ($map as $namespace => $path) { - $loader->setPsr4($namespace, $path); - } - - $classMap = require __DIR__ . '/autoload_classmap.php'; - if ($classMap) { - $loader->addClassMap($classMap); - } - } - - $loader->register(true); - - if ($useStaticLoader) { - $includeFiles = Composer\Autoload\ComposerStaticInitDontChange::$files; - } else { - $includeFiles = require __DIR__ . '/autoload_files.php'; - } - foreach ($includeFiles as $fileIdentifier => $file) { - composerRequireDontChange($fileIdentifier, $file); - } - - return $loader; - } -} - -function composerRequireDontChange($fileIdentifier, $file) -{ - if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { - require $file; - - $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; - } -} diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php deleted file mode 100644 index 1f260993..00000000 --- a/vendor/composer/autoload_static.php +++ /dev/null @@ -1,76 +0,0 @@ - __DIR__ . '/..' . '/paragonie/random_compat/lib/random.php', - ); - - public static $prefixLengthsPsr4 = array ( - 'P' => - array ( - 'PrivateBin\\' => 11, - ), - ); - - public static $prefixDirsPsr4 = array ( - 'PrivateBin\\' => - array ( - 0 => __DIR__ . '/../..' . '/lib', - ), - ); - - public static $prefixesPsr0 = array ( - 'I' => - array ( - 'Identicon' => - array ( - 0 => __DIR__ . '/..' . '/yzalis/identicon/src', - ), - ), - ); - - public static $classMap = array ( - 'Identicon\\Generator\\BaseGenerator' => __DIR__ . '/..' . '/yzalis/identicon/src/Identicon/Generator/BaseGenerator.php', - 'Identicon\\Generator\\GdGenerator' => __DIR__ . '/..' . '/yzalis/identicon/src/Identicon/Generator/GdGenerator.php', - 'Identicon\\Generator\\GeneratorInterface' => __DIR__ . '/..' . '/yzalis/identicon/src/Identicon/Generator/GeneratorInterface.php', - 'Identicon\\Generator\\ImageMagickGenerator' => __DIR__ . '/..' . '/yzalis/identicon/src/Identicon/Generator/ImageMagickGenerator.php', - 'Identicon\\Identicon' => __DIR__ . '/..' . '/yzalis/identicon/src/Identicon/Identicon.php', - 'PrivateBin\\Configuration' => __DIR__ . '/../..' . '/lib/Configuration.php', - 'PrivateBin\\Controller' => __DIR__ . '/../..' . '/lib/Controller.php', - 'PrivateBin\\Data\\AbstractData' => __DIR__ . '/../..' . '/lib/Data/AbstractData.php', - 'PrivateBin\\Data\\Database' => __DIR__ . '/../..' . '/lib/Data/Database.php', - 'PrivateBin\\Data\\Filesystem' => __DIR__ . '/../..' . '/lib/Data/Filesystem.php', - 'PrivateBin\\Filter' => __DIR__ . '/../..' . '/lib/Filter.php', - 'PrivateBin\\I18n' => __DIR__ . '/../..' . '/lib/I18n.php', - 'PrivateBin\\Json' => __DIR__ . '/../..' . '/lib/Json.php', - 'PrivateBin\\Model' => __DIR__ . '/../..' . '/lib/Model.php', - 'PrivateBin\\Model\\AbstractModel' => __DIR__ . '/../..' . '/lib/Model/AbstractModel.php', - 'PrivateBin\\Model\\Comment' => __DIR__ . '/../..' . '/lib/Model/Comment.php', - 'PrivateBin\\Model\\Paste' => __DIR__ . '/../..' . '/lib/Model/Paste.php', - 'PrivateBin\\Persistence\\AbstractPersistence' => __DIR__ . '/../..' . '/lib/Persistence/AbstractPersistence.php', - 'PrivateBin\\Persistence\\DataStore' => __DIR__ . '/../..' . '/lib/Persistence/DataStore.php', - 'PrivateBin\\Persistence\\PurgeLimiter' => __DIR__ . '/../..' . '/lib/Persistence/PurgeLimiter.php', - 'PrivateBin\\Persistence\\ServerSalt' => __DIR__ . '/../..' . '/lib/Persistence/ServerSalt.php', - 'PrivateBin\\Persistence\\TrafficLimiter' => __DIR__ . '/../..' . '/lib/Persistence/TrafficLimiter.php', - 'PrivateBin\\Request' => __DIR__ . '/../..' . '/lib/Request.php', - 'PrivateBin\\Sjcl' => __DIR__ . '/../..' . '/lib/Sjcl.php', - 'PrivateBin\\View' => __DIR__ . '/../..' . '/lib/View.php', - 'PrivateBin\\Vizhash16x16' => __DIR__ . '/../..' . '/lib/Vizhash16x16.php', - ); - - public static function getInitializer(ClassLoader $loader) - { - return \Closure::bind(function () use ($loader) { - $loader->prefixLengthsPsr4 = ComposerStaticInitDontChange::$prefixLengthsPsr4; - $loader->prefixDirsPsr4 = ComposerStaticInitDontChange::$prefixDirsPsr4; - $loader->prefixesPsr0 = ComposerStaticInitDontChange::$prefixesPsr0; - $loader->classMap = ComposerStaticInitDontChange::$classMap; - - }, null, ClassLoader::class); - } -} diff --git a/vendor/paragonie/random_compat/lib/byte_safe_strings.php b/vendor/paragonie/random_compat/lib/byte_safe_strings.php deleted file mode 100644 index 2a7335dd..00000000 --- a/vendor/paragonie/random_compat/lib/byte_safe_strings.php +++ /dev/null @@ -1,181 +0,0 @@ - RandomCompat_strlen($binary_string)) { - return ''; - } - - return (string) mb_substr($binary_string, $start, $length, '8bit'); - } - - } else { - - /** - * substr() implementation that isn't brittle to mbstring.func_overload - * - * This version just uses the default substr() - * - * @param string $binary_string - * @param int $start - * @param int $length (optional) - * - * @throws TypeError - * - * @return string - */ - function RandomCompat_substr($binary_string, $start, $length = null) - { - if (!is_string($binary_string)) { - throw new TypeError( - 'RandomCompat_substr(): First argument should be a string' - ); - } - - if (!is_int($start)) { - throw new TypeError( - 'RandomCompat_substr(): Second argument should be an integer' - ); - } - - if ($length !== null) { - if (!is_int($length)) { - throw new TypeError( - 'RandomCompat_substr(): Third argument should be an integer, or omitted' - ); - } - - return (string) substr($binary_string, $start, $length); - } - - return (string) substr($binary_string, $start); - } - } -} diff --git a/vendor/paragonie/random_compat/lib/cast_to_int.php b/vendor/paragonie/random_compat/lib/cast_to_int.php deleted file mode 100644 index 14b4b348..00000000 --- a/vendor/paragonie/random_compat/lib/cast_to_int.php +++ /dev/null @@ -1,75 +0,0 @@ - operators might accidentally let a float - * through. - * - * @param int|float $number The number we want to convert to an int - * @param bool $fail_open Set to true to not throw an exception - * - * @return float|int - * @psalm-suppress InvalidReturnType - * - * @throws TypeError - */ - function RandomCompat_intval($number, $fail_open = false) - { - if (is_int($number) || is_float($number)) { - $number += 0; - } elseif (is_numeric($number)) { - $number += 0; - } - - if ( - is_float($number) - && - $number > ~PHP_INT_MAX - && - $number < PHP_INT_MAX - ) { - $number = (int) $number; - } - - if (is_int($number)) { - return (int) $number; - } elseif (!$fail_open) { - throw new TypeError( - 'Expected an integer.' - ); - } - return $number; - } -} diff --git a/vendor/paragonie/random_compat/lib/error_polyfill.php b/vendor/paragonie/random_compat/lib/error_polyfill.php deleted file mode 100644 index 6d4a19ac..00000000 --- a/vendor/paragonie/random_compat/lib/error_polyfill.php +++ /dev/null @@ -1,49 +0,0 @@ -= 70000) { - return; -} - -if (!defined('RANDOM_COMPAT_READ_BUFFER')) { - define('RANDOM_COMPAT_READ_BUFFER', 8); -} - -$RandomCompatDIR = dirname(__FILE__); - -require_once $RandomCompatDIR . DIRECTORY_SEPARATOR . 'byte_safe_strings.php'; -require_once $RandomCompatDIR . DIRECTORY_SEPARATOR . 'cast_to_int.php'; -require_once $RandomCompatDIR . DIRECTORY_SEPARATOR . 'error_polyfill.php'; - -if (!is_callable('random_bytes')) { - /** - * PHP 5.2.0 - 5.6.x way to implement random_bytes() - * - * We use conditional statements here to define the function in accordance - * to the operating environment. It's a micro-optimization. - * - * In order of preference: - * 1. Use libsodium if available. - * 2. fread() /dev/urandom if available (never on Windows) - * 3. mcrypt_create_iv($bytes, MCRYPT_DEV_URANDOM) - * 4. COM('CAPICOM.Utilities.1')->GetRandom() - * - * See RATIONALE.md for our reasoning behind this particular order - */ - if (extension_loaded('libsodium')) { - // See random_bytes_libsodium.php - if (PHP_VERSION_ID >= 50300 && is_callable('\\Sodium\\randombytes_buf')) { - require_once $RandomCompatDIR . DIRECTORY_SEPARATOR . 'random_bytes_libsodium.php'; - } elseif (method_exists('Sodium', 'randombytes_buf')) { - require_once $RandomCompatDIR . DIRECTORY_SEPARATOR . 'random_bytes_libsodium_legacy.php'; - } - } - - /** - * Reading directly from /dev/urandom: - */ - if (DIRECTORY_SEPARATOR === '/') { - // DIRECTORY_SEPARATOR === '/' on Unix-like OSes -- this is a fast - // way to exclude Windows. - $RandomCompatUrandom = true; - $RandomCompat_basedir = ini_get('open_basedir'); - - if (!empty($RandomCompat_basedir)) { - $RandomCompat_open_basedir = explode( - PATH_SEPARATOR, - strtolower($RandomCompat_basedir) - ); - $RandomCompatUrandom = (array() !== array_intersect( - array('/dev', '/dev/', '/dev/urandom'), - $RandomCompat_open_basedir - )); - $RandomCompat_open_basedir = null; - } - - if ( - !is_callable('random_bytes') - && - $RandomCompatUrandom - && - @is_readable('/dev/urandom') - ) { - // Error suppression on is_readable() in case of an open_basedir - // or safe_mode failure. All we care about is whether or not we - // can read it at this point. If the PHP environment is going to - // panic over trying to see if the file can be read in the first - // place, that is not helpful to us here. - - // See random_bytes_dev_urandom.php - require_once $RandomCompatDIR . DIRECTORY_SEPARATOR . 'random_bytes_dev_urandom.php'; - } - // Unset variables after use - $RandomCompat_basedir = null; - } else { - $RandomCompatUrandom = false; - } - - /** - * mcrypt_create_iv() - * - * We only want to use mcypt_create_iv() if: - * - * - random_bytes() hasn't already been defined - * - the mcrypt extensions is loaded - * - One of these two conditions is true: - * - We're on Windows (DIRECTORY_SEPARATOR !== '/') - * - We're not on Windows and /dev/urandom is readabale - * (i.e. we're not in a chroot jail) - * - Special case: - * - If we're not on Windows, but the PHP version is between - * 5.6.10 and 5.6.12, we don't want to use mcrypt. It will - * hang indefinitely. This is bad. - * - If we're on Windows, we want to use PHP >= 5.3.7 or else - * we get insufficient entropy errors. - */ - if ( - !is_callable('random_bytes') - && - // Windows on PHP < 5.3.7 is broken, but non-Windows is not known to be. - (DIRECTORY_SEPARATOR === '/' || PHP_VERSION_ID >= 50307) - && - // Prevent this code from hanging indefinitely on non-Windows; - // see https://bugs.php.net/bug.php?id=69833 - ( - DIRECTORY_SEPARATOR !== '/' || - (PHP_VERSION_ID <= 50609 || PHP_VERSION_ID >= 50613) - ) - && - extension_loaded('mcrypt') - ) { - // See random_bytes_mcrypt.php - require_once $RandomCompatDIR . DIRECTORY_SEPARATOR . 'random_bytes_mcrypt.php'; - } - $RandomCompatUrandom = null; - - /** - * This is a Windows-specific fallback, for when the mcrypt extension - * isn't loaded. - */ - if ( - !is_callable('random_bytes') - && - extension_loaded('com_dotnet') - && - class_exists('COM') - ) { - $RandomCompat_disabled_classes = preg_split( - '#\s*,\s*#', - strtolower(ini_get('disable_classes')) - ); - - if (!in_array('com', $RandomCompat_disabled_classes)) { - try { - $RandomCompatCOMtest = new COM('CAPICOM.Utilities.1'); - if (method_exists($RandomCompatCOMtest, 'GetRandom')) { - // See random_bytes_com_dotnet.php - require_once $RandomCompatDIR . DIRECTORY_SEPARATOR . 'random_bytes_com_dotnet.php'; - } - } catch (com_exception $e) { - // Don't try to use it. - } - } - $RandomCompat_disabled_classes = null; - $RandomCompatCOMtest = null; - } - - /** - * throw new Exception - */ - if (!is_callable('random_bytes')) { - /** - * We don't have any more options, so let's throw an exception right now - * and hope the developer won't let it fail silently. - * - * @param mixed $length - * @psalm-suppress MissingReturnType - * @psalm-suppress InvalidReturnType - * @throws Exception - * @return string - */ - function random_bytes($length) - { - unset($length); // Suppress "variable not used" warnings. - throw new Exception( - 'There is no suitable CSPRNG installed on your system' - ); - return ''; - } - } -} - -if (!is_callable('random_int')) { - require_once $RandomCompatDIR . DIRECTORY_SEPARATOR . 'random_int.php'; -} - -$RandomCompatDIR = null; diff --git a/vendor/paragonie/random_compat/lib/random_bytes_com_dotnet.php b/vendor/paragonie/random_compat/lib/random_bytes_com_dotnet.php deleted file mode 100644 index 2b83369e..00000000 --- a/vendor/paragonie/random_compat/lib/random_bytes_com_dotnet.php +++ /dev/null @@ -1,88 +0,0 @@ -GetRandom($bytes, 0)); - if (RandomCompat_strlen($buf) >= $bytes) { - /** - * Return our random entropy buffer here: - */ - return RandomCompat_substr($buf, 0, $bytes); - } - ++$execCount; - } while ($execCount < $bytes); - - /** - * If we reach here, PHP has failed us. - */ - throw new Exception( - 'Could not gather sufficient random data' - ); - } -} \ No newline at end of file diff --git a/vendor/paragonie/random_compat/lib/random_bytes_dev_urandom.php b/vendor/paragonie/random_compat/lib/random_bytes_dev_urandom.php deleted file mode 100644 index ac36034a..00000000 --- a/vendor/paragonie/random_compat/lib/random_bytes_dev_urandom.php +++ /dev/null @@ -1,167 +0,0 @@ - 0); - - /** - * Is our result valid? - */ - if (is_string($buf)) { - if (RandomCompat_strlen($buf) === $bytes) { - /** - * Return our random entropy buffer here: - */ - return $buf; - } - } - } - - /** - * If we reach here, PHP has failed us. - */ - throw new Exception( - 'Error reading from source device' - ); - } -} diff --git a/vendor/paragonie/random_compat/lib/random_bytes_libsodium.php b/vendor/paragonie/random_compat/lib/random_bytes_libsodium.php deleted file mode 100644 index 1e017c14..00000000 --- a/vendor/paragonie/random_compat/lib/random_bytes_libsodium.php +++ /dev/null @@ -1,88 +0,0 @@ - 2147483647) { - $buf = ''; - for ($i = 0; $i < $bytes; $i += 1073741824) { - $n = ($bytes - $i) > 1073741824 - ? 1073741824 - : $bytes - $i; - $buf .= \Sodium\randombytes_buf($n); - } - } else { - $buf = \Sodium\randombytes_buf($bytes); - } - - if ($buf !== false) { - if (RandomCompat_strlen($buf) === $bytes) { - return $buf; - } - } - - /** - * If we reach here, PHP has failed us. - */ - throw new Exception( - 'Could not gather sufficient random data' - ); - } -} diff --git a/vendor/paragonie/random_compat/lib/random_bytes_libsodium_legacy.php b/vendor/paragonie/random_compat/lib/random_bytes_libsodium_legacy.php deleted file mode 100644 index 388da4dc..00000000 --- a/vendor/paragonie/random_compat/lib/random_bytes_libsodium_legacy.php +++ /dev/null @@ -1,92 +0,0 @@ - 2147483647) { - for ($i = 0; $i < $bytes; $i += 1073741824) { - $n = ($bytes - $i) > 1073741824 - ? 1073741824 - : $bytes - $i; - $buf .= Sodium::randombytes_buf((int) $n); - } - } else { - $buf .= Sodium::randombytes_buf((int) $bytes); - } - - if (is_string($buf)) { - if (RandomCompat_strlen($buf) === $bytes) { - return $buf; - } - } - - /** - * If we reach here, PHP has failed us. - */ - throw new Exception( - 'Could not gather sufficient random data' - ); - } -} diff --git a/vendor/paragonie/random_compat/lib/random_bytes_mcrypt.php b/vendor/paragonie/random_compat/lib/random_bytes_mcrypt.php deleted file mode 100644 index 879450c9..00000000 --- a/vendor/paragonie/random_compat/lib/random_bytes_mcrypt.php +++ /dev/null @@ -1,77 +0,0 @@ - operators might accidentally let a float - * through. - */ - - try { - $min = RandomCompat_intval($min); - } catch (TypeError $ex) { - throw new TypeError( - 'random_int(): $min must be an integer' - ); - } - - try { - $max = RandomCompat_intval($max); - } catch (TypeError $ex) { - throw new TypeError( - 'random_int(): $max must be an integer' - ); - } - - /** - * Now that we've verified our weak typing system has given us an integer, - * let's validate the logic then we can move forward with generating random - * integers along a given range. - */ - if ($min > $max) { - throw new Error( - 'Minimum value must be less than or equal to the maximum value' - ); - } - - if ($max === $min) { - return (int) $min; - } - - /** - * Initialize variables to 0 - * - * We want to store: - * $bytes => the number of random bytes we need - * $mask => an integer bitmask (for use with the &) operator - * so we can minimize the number of discards - */ - $attempts = $bits = $bytes = $mask = $valueShift = 0; - - /** - * At this point, $range is a positive number greater than 0. It might - * overflow, however, if $max - $min > PHP_INT_MAX. PHP will cast it to - * a float and we will lose some precision. - */ - $range = $max - $min; - - /** - * Test for integer overflow: - */ - if (!is_int($range)) { - - /** - * Still safely calculate wider ranges. - * Provided by @CodesInChaos, @oittaa - * - * @ref https://gist.github.com/CodesInChaos/03f9ea0b58e8b2b8d435 - * - * We use ~0 as a mask in this case because it generates all 1s - * - * @ref https://eval.in/400356 (32-bit) - * @ref http://3v4l.org/XX9r5 (64-bit) - */ - $bytes = PHP_INT_SIZE; - $mask = ~0; - - } else { - - /** - * $bits is effectively ceil(log($range, 2)) without dealing with - * type juggling - */ - while ($range > 0) { - if ($bits % 8 === 0) { - ++$bytes; - } - ++$bits; - $range >>= 1; - $mask = $mask << 1 | 1; - } - $valueShift = $min; - } - - $val = 0; - /** - * Now that we have our parameters set up, let's begin generating - * random integers until one falls between $min and $max - */ - do { - /** - * The rejection probability is at most 0.5, so this corresponds - * to a failure probability of 2^-128 for a working RNG - */ - if ($attempts > 128) { - throw new Exception( - 'random_int: RNG is broken - too many rejections' - ); - } - - /** - * Let's grab the necessary number of random bytes - */ - $randomByteString = random_bytes($bytes); - - /** - * Let's turn $randomByteString into an integer - * - * This uses bitwise operators (<< and |) to build an integer - * out of the values extracted from ord() - * - * Example: [9F] | [6D] | [32] | [0C] => - * 159 + 27904 + 3276800 + 201326592 => - * 204631455 - */ - $val &= 0; - for ($i = 0; $i < $bytes; ++$i) { - $val |= ord($randomByteString[$i]) << ($i * 8); - } - - /** - * Apply mask - */ - $val &= $mask; - $val += $valueShift; - - ++$attempts; - /** - * If $val overflows to a floating point number, - * ... or is larger than $max, - * ... or smaller than $min, - * then try again. - */ - } while (!is_int($val) || $val > $max || $val < $min); - - return (int) $val; - } -} diff --git a/vendor/paragonie/random_compat/other/build_phar.php b/vendor/paragonie/random_compat/other/build_phar.php deleted file mode 100644 index 70ef4b2e..00000000 --- a/vendor/paragonie/random_compat/other/build_phar.php +++ /dev/null @@ -1,57 +0,0 @@ -buildFromDirectory(dirname(__DIR__).'/lib'); -rename( - dirname(__DIR__).'/lib/index.php', - dirname(__DIR__).'/lib/random.php' -); - -/** - * If we pass an (optional) path to a private key as a second argument, we will - * sign the Phar with OpenSSL. - * - * If you leave this out, it will produce an unsigned .phar! - */ -if ($argc > 1) { - if (!@is_readable($argv[1])) { - echo 'Could not read the private key file:', $argv[1], "\n"; - exit(255); - } - $pkeyFile = file_get_contents($argv[1]); - - $private = openssl_get_privatekey($pkeyFile); - if ($private !== false) { - $pkey = ''; - openssl_pkey_export($private, $pkey); - $phar->setSignatureAlgorithm(Phar::OPENSSL, $pkey); - - /** - * Save the corresponding public key to the file - */ - if (!@is_readable($dist.'/random_compat.phar.pubkey')) { - $details = openssl_pkey_get_details($private); - file_put_contents( - $dist.'/random_compat.phar.pubkey', - $details['key'] - ); - } - } else { - echo 'An error occurred reading the private key from OpenSSL.', "\n"; - exit(255); - } -} diff --git a/vendor/paragonie/random_compat/psalm-autoload.php b/vendor/paragonie/random_compat/psalm-autoload.php deleted file mode 100644 index d71d1b81..00000000 --- a/vendor/paragonie/random_compat/psalm-autoload.php +++ /dev/null @@ -1,9 +0,0 @@ - - */ -class BaseGenerator -{ - /** - * @var mixed - */ - protected $generatedImage; - - /** - * @var integer - */ - protected $color; - - /** - * @var integer - */ - protected $backgroundColor; - - /** - * @var integer - */ - protected $size; - - /** - * @var integer - */ - protected $pixelRatio; - - /** - * @var string - */ - private $hash; - - /** - * @var array - */ - private $arrayOfSquare = array(); - - /** - * Set the image color - * - * @param string|array $color The color in hexa (6 chars) or rgb array - * - * @return this - */ - public function setColor($color) - { - if (null === $color) { - return $this; - } - - $this->color = $this->convertColor($color); - - return $this; - } - - /** - * Set the image background color - * - * @param string|array $backgroundColor The color in hexa (6 chars) or rgb array - * - * @return this - */ - public function setBackgroundColor($backgroundColor) - { - if (null === $backgroundColor) { - return $this; - } - - $this->backgroundColor = $this->convertColor($backgroundColor); - - return $this; - } - - private function convertColor($color) - { - $convertedColor = array(); - if (is_array($color)) { - $convertedColor[0] = $color[0]; - $convertedColor[1] = $color[1]; - $convertedColor[2] = $color[2]; - } else { - if (false !== strpos($color, '#')) { - $color = substr($color, 1); - } - $convertedColor[0] = hexdec(substr($color, 0, 2)); - $convertedColor[1] = hexdec(substr($color, 2, 2)); - $convertedColor[2] = hexdec(substr($color, 4, 2)); - } - - return $convertedColor; - } - - /** - * Get the color - * - * @return array - */ - public function getColor() - { - return $this->color; - } - - - /** - * Get the background color - * - * @return array - */ - public function getBackgroundColor() - { - return $this->backgroundColor; - } - - /** - * Convert the hash into an multidimensionnal array of boolean - * - * @return this - */ - private function convertHashToArrayOfBoolean() - { - preg_match_all('/(\w)(\w)/', $this->hash, $chars); - foreach ($chars[1] as $i => $char) { - if ($i % 3 == 0) { - $this->arrayOfSquare[$i/3][0] = $this->convertHexaToBoolean($char); - $this->arrayOfSquare[$i/3][4] = $this->convertHexaToBoolean($char); - } elseif ($i % 3 == 1) { - $this->arrayOfSquare[$i/3][1] = $this->convertHexaToBoolean($char); - $this->arrayOfSquare[$i/3][3] = $this->convertHexaToBoolean($char); - } else { - $this->arrayOfSquare[$i/3][2] = $this->convertHexaToBoolean($char); - } - ksort($this->arrayOfSquare[$i/3]); - } - - $this->color[0] = hexdec(array_pop($chars[1]))*16; - $this->color[1] = hexdec(array_pop($chars[1]))*16; - $this->color[2] = hexdec(array_pop($chars[1]))*16; - - return $this; - } - - /** - * Convert an heaxecimal number into a boolean - * - * @param string $hexa - * - * @return boolean - */ - private function convertHexaToBoolean($hexa) - { - return (bool) intval(round(hexdec($hexa)/10)); - } - - /** - * - * - * @return array - */ - public function getArrayOfSquare() - { - return $this->arrayOfSquare; - } - - /** - * Get the identicon string hash - * - * @return string - */ - public function getHash() - { - return $this->hash; - } - - /** - * Generate a hash fron the original string - * - * @param string $string - * - * @return this - */ - public function setString($string) - { - if (null === $string) { - throw new \Exception('The string cannot be null.'); - } - - $this->hash = md5($string); - - $this->convertHashToArrayOfBoolean(); - - return $this; - } - - /** - * Set the image size - * - * @param integer $size - * - * @return this - */ - public function setSize($size) - { - if (null === $size) { - return $this; - } - - $this->size = $size; - $this->pixelRatio = round($size / 5); - - return $this; - } - - /** - * Get the image size - * - * @return integer - */ - public function getSize() - { - return $this->size; - } - - /** - * Get the pixel ratio - * - * @return array - */ - public function getPixelRatio() - { - return $this->pixelRatio; - } -} diff --git a/vendor/yzalis/identicon/src/Identicon/Generator/GdGenerator.php b/vendor/yzalis/identicon/src/Identicon/Generator/GdGenerator.php deleted file mode 100644 index ef7b90ff..00000000 --- a/vendor/yzalis/identicon/src/Identicon/Generator/GdGenerator.php +++ /dev/null @@ -1,76 +0,0 @@ - - */ -class GdGenerator extends BaseGenerator implements GeneratorInterface -{ - public function __construct() - { - if (!extension_loaded('gd')) { - throw new \Exception('GD does not appear to be avaliable in your PHP installation. Please try another generator'); - } - } - - private function generateImage() - { - // prepare image - $this->generatedImage = imagecreatetruecolor($this->getPixelRatio() * 5, $this->getPixelRatio() * 5); - - $rgbBackgroundColor = $this->getBackgroundColor(); - if (null === $rgbBackgroundColor) { - $background = imagecolorallocate($this->generatedImage, 0, 0, 0); - imagecolortransparent($this->generatedImage, $background); - } else { - $background = imagecolorallocate($this->generatedImage, $rgbBackgroundColor[0], $rgbBackgroundColor[1], $rgbBackgroundColor[2]); - imagefill($this->generatedImage, 0, 0, $background); - } - - // prepage color - $rgbColor = $this->getColor(); - $gdColor = imagecolorallocate($this->generatedImage, $rgbColor[0], $rgbColor[1], $rgbColor[2]); - - // draw content - foreach ($this->getArrayOfSquare() as $lineKey => $lineValue) { - foreach ($lineValue as $colKey => $colValue) { - if (true === $colValue) { - imagefilledrectangle($this->generatedImage, $colKey * $this->getPixelRatio(), $lineKey * $this->getPixelRatio(), ($colKey + 1) * $this->getPixelRatio(), ($lineKey + 1) * $this->getPixelRatio(), $gdColor); - } - } - } - - return $this; - } - - /** - * {@inheritDoc} - */ - public function getImageBinaryData($string, $size = null, $color = null, $backgroundColor = null) - { - ob_start(); - imagepng($this->getImageResource($string, $size, $color, $backgroundColor)); - $imageData = ob_get_contents(); - ob_end_clean(); - - return $imageData; - } - - /** - * {@inheritDoc} - */ - public function getImageResource($string, $size = null, $color = null, $backgroundColor = null) - { - $this - ->setString($string) - ->setSize($size) - ->setColor($color) - ->setBackgroundColor($backgroundColor) - ->generateImage(); - - return $this->generatedImage; - } -} diff --git a/vendor/yzalis/identicon/src/Identicon/Generator/GeneratorInterface.php b/vendor/yzalis/identicon/src/Identicon/Generator/GeneratorInterface.php deleted file mode 100644 index 78be7d48..00000000 --- a/vendor/yzalis/identicon/src/Identicon/Generator/GeneratorInterface.php +++ /dev/null @@ -1,33 +0,0 @@ - - */ -interface GeneratorInterface -{ - /** - * - * - * @param string $string - * @param integer $size - * @param array|string $color - * @param array|string $backgroundColor - * - * @return mixed - */ - function getImageBinaryData($string, $size = null, $color = null, $backgroundColor = null); - - /** - * - * - * @param string $string - * @param integer $size - * @param array|string $color - * @param array|string $backgroundColor - * - * @return string - */ - function getImageResource($string, $size = null, $color = null, $backgroundColor = null); -} diff --git a/vendor/yzalis/identicon/src/Identicon/Generator/ImageMagickGenerator.php b/vendor/yzalis/identicon/src/Identicon/Generator/ImageMagickGenerator.php deleted file mode 100644 index f11c51d1..00000000 --- a/vendor/yzalis/identicon/src/Identicon/Generator/ImageMagickGenerator.php +++ /dev/null @@ -1,80 +0,0 @@ - - */ -class ImageMagickGenerator extends BaseGenerator implements GeneratorInterface -{ - public function __construct() - { - if (!extension_loaded('imagick')) { - throw new \Exception('ImageMagick does not appear to be avaliable in your PHP installation. Please try another generator'); - } - } - - private function generateImage() - { - $this->generatedImage = new \Imagick(); - $rgbBackgroundColor = $this->getBackgroundColor(); - - if (null === $rgbBackgroundColor) { - $background = 'none'; - } else { - $background = new \ImagickPixel("rgb($rgbBackgroundColor[0],$rgbBackgroundColor[1],$rgbBackgroundColor[2])"); - } - - $this->generatedImage->newImage($this->pixelRatio * 5, $this->pixelRatio * 5, $background, 'png'); - - // prepare color - $rgbColor = $this->getColor(); - $color = new \ImagickPixel("rgb($rgbColor[0],$rgbColor[1],$rgbColor[2])"); - - $draw = new \ImagickDraw(); - $draw->setFillColor($color); - - // draw the content - foreach ($this->getArrayOfSquare() as $lineKey => $lineValue) { - foreach ($lineValue as $colKey => $colValue) { - if (true === $colValue) { - $draw->rectangle( $colKey * $this->pixelRatio, $lineKey * $this->pixelRatio, ($colKey + 1) * $this->pixelRatio, ($lineKey + 1) * $this->pixelRatio); - } - } - } - - $this->generatedImage->drawImage($draw); - - return $this; - } - - /** - * {@inheritDoc} - */ - public function getImageBinaryData($string, $size = null, $color = null, $backgroundColor = null) - { - ob_start(); - echo $this->getImageResource($string, $size, $color, $backgroundColor); - $imageData = ob_get_contents(); - ob_end_clean(); - - return $imageData; - } - - /** - * {@inheritDoc} - */ - public function getImageResource($string, $size = null, $color = null, $backgroundColor = null) - { - $this - ->setString($string) - ->setSize($size) - ->setColor($color) - ->setBackgroundColor($backgroundColor) - ->generateImage(); - - return $this->generatedImage; - } -} diff --git a/vendor/yzalis/identicon/src/Identicon/Identicon.php b/vendor/yzalis/identicon/src/Identicon/Identicon.php deleted file mode 100644 index c78ccc34..00000000 --- a/vendor/yzalis/identicon/src/Identicon/Identicon.php +++ /dev/null @@ -1,100 +0,0 @@ - - */ -class Identicon -{ - /** - * @var GeneratorInterface - */ - private $generator; - - public function __construct($generator = null) - { - if (null === $generator) { - $this->generator = new GdGenerator(); - } else { - $this->generator = $generator; - } - - } - - /** - * Set the image generetor - * - * @param GeneratorInterface $generator - * - * @throws \Exception - */ - public function setGenerator(GeneratorInterface $generator) - { - $this->generator = $generator; - - return $this; - } - - /** - * Display an Identicon image - * - * @param string $string - * @param integer $size - * @param string $color - * @param string $backgroundColor - */ - public function displayImage($string, $size = 64, $color = null, $backgroundColor = null) - { - header("Content-Type: image/png"); - echo $this->getImageData($string, $size, $color, $backgroundColor); - } - - /** - * Get an Identicon PNG image data - * - * @param string $string - * @param integer $size - * @param string $color - * @param string $backgroundColor - * - * @return string - */ - public function getImageData($string, $size = 64, $color = null, $backgroundColor = null) - { - return $this->generator->getImageBinaryData($string, $size, $color, $backgroundColor); - } - - /** - * Get an Identicon PNG image resource - * - * @param string $string - * @param integer $size - * @param string $color - * @param string $backgroundColor - * - * @return string - */ - public function getImageResource($string, $size = 64, $color = null, $backgroundColor = null) - { - return $this->generator->getImageResource($string, $size, $color, $backgroundColor); - } - - /** - * Get an Identicon PNG image data as base 64 encoded - * - * @param string $string - * @param integer $size - * @param string $color - * @param string $backgroundColor - * - * @return string - */ - public function getImageDataUri($string, $size = 64, $color = null, $backgroundColor = null) - { - return sprintf('data:image/png;base64,%s', base64_encode($this->getImageData($string, $size, $color, $backgroundColor))); - } -} diff --git a/vendor/yzalis/identicon/src/autoload.php b/vendor/yzalis/identicon/src/autoload.php deleted file mode 100644 index 33f57e93..00000000 --- a/vendor/yzalis/identicon/src/autoload.php +++ /dev/null @@ -1,30 +0,0 @@ - Date: Tue, 14 Jan 2020 21:42:06 +0100 Subject: [PATCH 2/2] version 1.3.2 --- CHANGELOG.md | 218 + CREDITS.md | 48 + INSTALL.md | 193 + LICENSE.md | 818 ++ README.md | 111 + SECURITY.md | 18 + browserconfig.xml | 11 + cfg/.htaccess | 1 + cfg/conf.sample.php | 175 + css/bootstrap/bootstrap-3.4.1.css | 5 + css/bootstrap/bootstrap-theme-3.4.1.css | 5 + css/bootstrap/darkstrap-0.9.3.css | 8061 +++++++++++++++++ .../fonts/glyphicons-halflings-regular.eot | Bin 0 -> 20127 bytes .../fonts/glyphicons-halflings-regular.svg | 288 + .../fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 45404 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 0 -> 23424 bytes .../fonts/glyphicons-halflings-regular.woff2 | Bin 0 -> 18028 bytes css/bootstrap/privatebin.css | 207 + css/noscript.css | 15 + css/prettify/desert.css | 1 + css/prettify/doxy.css | 1 + css/prettify/prettify.css | 1 + css/prettify/sons-of-obsidian.css | 1 + css/prettify/sunburst.css | 1 + css/privatebin.css | 486 + i18n/bg.json | 172 + i18n/cs.json | 172 + i18n/de.json | 172 + i18n/es.json | 172 + i18n/fr.json | 181 + i18n/hu.json | 172 + i18n/it.json | 172 + i18n/languages.json | 181 + i18n/nl.json | 172 + i18n/no.json | 172 + i18n/oc.json | 181 + i18n/pl.json | 172 + i18n/pt.json | 172 + i18n/ru.json | 182 + i18n/sl.json | 181 + i18n/uk.json | 182 + i18n/zh.json | 172 + img/android-chrome-192x192.png | Bin 0 -> 5557 bytes img/android-chrome-512x512.png | Bin 0 -> 23065 bytes img/apple-touch-icon.png | Bin 0 -> 3967 bytes img/busy.gif | Bin 0 -> 671 bytes img/favicon-16x16.png | Bin 0 -> 469 bytes img/favicon-32x32.png | Bin 0 -> 749 bytes img/favicon.ico | Bin 0 -> 15086 bytes img/icon.svg | 1 + img/icon_clone.png | Bin 0 -> 266 bytes img/icon_email.png | Bin 0 -> 253 bytes img/icon_new.png | Bin 0 -> 157 bytes img/icon_qr.png | Bin 0 -> 299 bytes img/icon_raw.png | Bin 0 -> 183 bytes img/icon_send.png | Bin 0 -> 209 bytes img/icon_shorten.png | Bin 0 -> 196 bytes img/logo.svg | 1 + img/mstile-144x144.png | Bin 0 -> 3644 bytes img/mstile-150x150.png | Bin 0 -> 3284 bytes img/mstile-310x150.png | Bin 0 -> 3580 bytes img/mstile-310x310.png | Bin 0 -> 9220 bytes img/mstile-70x70.png | Bin 0 -> 2424 bytes img/safari-pinned-tab.svg | 1 + index.php | 18 + js/base-x-3.0.7.js | 120 + js/base64-1.7.js | 237 + js/bootstrap-3.3.7.js | 7 + js/comment.jsonld | 35 + js/commentmeta.jsonld | 14 + js/jquery-3.4.1.js | 2 + js/kjua-0.6.0.js | 2 + js/legacy.js | 311 + js/package.json | 43 + js/paste.jsonld | 42 + js/pastemeta.jsonld | 31 + js/prettify.js | 30 + js/privatebin.js | 5273 +++++++++++ js/purify-2.0.7.js | 1 + js/rawinflate-0.3.js | 755 ++ js/showdown-1.9.1.js | 2 + js/types.jsonld | 124 + js/zlib-1.2.11.js | 146 + js/zlib-1.2.11.wasm | Bin 0 -> 61388 bytes lib/.htaccess | 1 + lib/Configuration.php | 265 + lib/Controller.php | 446 + lib/Data/AbstractData.php | 202 + lib/Data/Database.php | 782 ++ lib/Data/Filesystem.php | 365 + lib/Filter.php | 90 + lib/FormatV2.php | 127 + lib/I18n.php | 390 + lib/Json.php | 78 + lib/Model.php | 90 + lib/Model/AbstractModel.php | 181 + lib/Model/Comment.php | 185 + lib/Model/Paste.php | 258 + lib/Persistence/AbstractPersistence.php | 125 + lib/Persistence/DataStore.php | 97 + lib/Persistence/PurgeLimiter.php | 87 + lib/Persistence/ServerSalt.php | 104 + lib/Persistence/TrafficLimiter.php | 134 + lib/Request.php | 308 + lib/View.php | 61 + lib/Vizhash16x16.php | 233 + manifest.json | 17 + robots.txt | 8 + tpl/.htaccess | 1 + tpl/bootstrap.php | 593 ++ tpl/page.php | 273 + vendor/.htaccess | 1 + vendor/autoload.php | 7 + vendor/composer/ClassLoader.php | 445 + vendor/composer/autoload_classmap.php | 36 + vendor/composer/autoload_files.php | 10 + vendor/composer/autoload_namespaces.php | 9 + vendor/composer/autoload_psr4.php | 11 + vendor/composer/autoload_real.php | 70 + vendor/composer/autoload_static.php | 74 + .../random_compat/lib/byte_safe_strings.php | 195 + .../random_compat/lib/cast_to_int.php | 77 + .../random_compat/lib/error_polyfill.php | 49 + vendor/paragonie/random_compat/lib/random.php | 225 + .../lib/random_bytes_com_dotnet.php | 91 + .../lib/random_bytes_dev_urandom.php | 190 + .../lib/random_bytes_libsodium.php | 91 + .../lib/random_bytes_libsodium_legacy.php | 93 + .../random_compat/lib/random_bytes_mcrypt.php | 79 + .../random_compat/lib/random_int.php | 204 + .../src/Identicon/Generator/BaseGenerator.php | 250 + .../src/Identicon/Generator/GdGenerator.php | 90 + .../Generator/GeneratorInterface.php | 43 + .../Generator/ImageMagickGenerator.php | 98 + .../src/Identicon/Generator/SvgGenerator.php | 88 + .../identicon/src/Identicon/Identicon.php | 123 + 136 files changed, 28991 insertions(+) create mode 100644 CHANGELOG.md create mode 100644 CREDITS.md create mode 100644 INSTALL.md create mode 100644 LICENSE.md create mode 100644 README.md create mode 100644 SECURITY.md create mode 100644 browserconfig.xml create mode 100644 cfg/.htaccess create mode 100644 cfg/conf.sample.php create mode 100644 css/bootstrap/bootstrap-3.4.1.css create mode 100644 css/bootstrap/bootstrap-theme-3.4.1.css create mode 100644 css/bootstrap/darkstrap-0.9.3.css create mode 100644 css/bootstrap/fonts/glyphicons-halflings-regular.eot create mode 100644 css/bootstrap/fonts/glyphicons-halflings-regular.svg create mode 100644 css/bootstrap/fonts/glyphicons-halflings-regular.ttf create mode 100644 css/bootstrap/fonts/glyphicons-halflings-regular.woff create mode 100644 css/bootstrap/fonts/glyphicons-halflings-regular.woff2 create mode 100644 css/bootstrap/privatebin.css create mode 100644 css/noscript.css create mode 100644 css/prettify/desert.css create mode 100644 css/prettify/doxy.css create mode 100644 css/prettify/prettify.css create mode 100644 css/prettify/sons-of-obsidian.css create mode 100644 css/prettify/sunburst.css create mode 100644 css/privatebin.css create mode 100644 i18n/bg.json create mode 100644 i18n/cs.json create mode 100644 i18n/de.json create mode 100644 i18n/es.json create mode 100644 i18n/fr.json create mode 100644 i18n/hu.json create mode 100644 i18n/it.json create mode 100644 i18n/languages.json create mode 100644 i18n/nl.json create mode 100644 i18n/no.json create mode 100644 i18n/oc.json create mode 100644 i18n/pl.json create mode 100644 i18n/pt.json create mode 100644 i18n/ru.json create mode 100644 i18n/sl.json create mode 100644 i18n/uk.json create mode 100644 i18n/zh.json create mode 100644 img/android-chrome-192x192.png create mode 100644 img/android-chrome-512x512.png create mode 100644 img/apple-touch-icon.png create mode 100644 img/busy.gif create mode 100644 img/favicon-16x16.png create mode 100644 img/favicon-32x32.png create mode 100644 img/favicon.ico create mode 100644 img/icon.svg create mode 100644 img/icon_clone.png create mode 100644 img/icon_email.png create mode 100644 img/icon_new.png create mode 100644 img/icon_qr.png create mode 100644 img/icon_raw.png create mode 100644 img/icon_send.png create mode 100644 img/icon_shorten.png create mode 100644 img/logo.svg create mode 100644 img/mstile-144x144.png create mode 100644 img/mstile-150x150.png create mode 100644 img/mstile-310x150.png create mode 100644 img/mstile-310x310.png create mode 100644 img/mstile-70x70.png create mode 100644 img/safari-pinned-tab.svg create mode 100644 index.php create mode 100644 js/base-x-3.0.7.js create mode 100644 js/base64-1.7.js create mode 100644 js/bootstrap-3.3.7.js create mode 100644 js/comment.jsonld create mode 100644 js/commentmeta.jsonld create mode 100644 js/jquery-3.4.1.js create mode 100644 js/kjua-0.6.0.js create mode 100644 js/legacy.js create mode 100644 js/package.json create mode 100644 js/paste.jsonld create mode 100644 js/pastemeta.jsonld create mode 100644 js/prettify.js create mode 100644 js/privatebin.js create mode 100644 js/purify-2.0.7.js create mode 100644 js/rawinflate-0.3.js create mode 100644 js/showdown-1.9.1.js create mode 100644 js/types.jsonld create mode 100644 js/zlib-1.2.11.js create mode 100644 js/zlib-1.2.11.wasm create mode 100644 lib/.htaccess create mode 100644 lib/Configuration.php create mode 100644 lib/Controller.php create mode 100644 lib/Data/AbstractData.php create mode 100644 lib/Data/Database.php create mode 100644 lib/Data/Filesystem.php create mode 100644 lib/Filter.php create mode 100644 lib/FormatV2.php create mode 100644 lib/I18n.php create mode 100644 lib/Json.php create mode 100644 lib/Model.php create mode 100644 lib/Model/AbstractModel.php create mode 100644 lib/Model/Comment.php create mode 100644 lib/Model/Paste.php create mode 100644 lib/Persistence/AbstractPersistence.php create mode 100644 lib/Persistence/DataStore.php create mode 100644 lib/Persistence/PurgeLimiter.php create mode 100644 lib/Persistence/ServerSalt.php create mode 100644 lib/Persistence/TrafficLimiter.php create mode 100644 lib/Request.php create mode 100644 lib/View.php create mode 100644 lib/Vizhash16x16.php create mode 100644 manifest.json create mode 100644 robots.txt create mode 100644 tpl/.htaccess create mode 100644 tpl/bootstrap.php create mode 100644 tpl/page.php create mode 100644 vendor/.htaccess create mode 100644 vendor/autoload.php create mode 100644 vendor/composer/ClassLoader.php create mode 100644 vendor/composer/autoload_classmap.php create mode 100644 vendor/composer/autoload_files.php create mode 100644 vendor/composer/autoload_namespaces.php create mode 100644 vendor/composer/autoload_psr4.php create mode 100644 vendor/composer/autoload_real.php create mode 100644 vendor/composer/autoload_static.php create mode 100644 vendor/paragonie/random_compat/lib/byte_safe_strings.php create mode 100644 vendor/paragonie/random_compat/lib/cast_to_int.php create mode 100644 vendor/paragonie/random_compat/lib/error_polyfill.php create mode 100644 vendor/paragonie/random_compat/lib/random.php create mode 100644 vendor/paragonie/random_compat/lib/random_bytes_com_dotnet.php create mode 100644 vendor/paragonie/random_compat/lib/random_bytes_dev_urandom.php create mode 100644 vendor/paragonie/random_compat/lib/random_bytes_libsodium.php create mode 100644 vendor/paragonie/random_compat/lib/random_bytes_libsodium_legacy.php create mode 100644 vendor/paragonie/random_compat/lib/random_bytes_mcrypt.php create mode 100644 vendor/paragonie/random_compat/lib/random_int.php create mode 100644 vendor/yzalis/identicon/src/Identicon/Generator/BaseGenerator.php create mode 100644 vendor/yzalis/identicon/src/Identicon/Generator/GdGenerator.php create mode 100644 vendor/yzalis/identicon/src/Identicon/Generator/GeneratorInterface.php create mode 100644 vendor/yzalis/identicon/src/Identicon/Generator/ImageMagickGenerator.php create mode 100644 vendor/yzalis/identicon/src/Identicon/Generator/SvgGenerator.php create mode 100644 vendor/yzalis/identicon/src/Identicon/Identicon.php diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..085c9a5c --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,218 @@ +# PrivateBin version history + + * **1.4 (not yet released)** + * **1.3.2 (2020-01-11)** + * ADDED: Translation for Ukrainian (#533) + * ADDED: Option to send a mail with the link, when creating a paste (#398) + * ADDED: Add support for CONFIG_PATH environment variable (#552) + * CHANGED: Upgrading libraries to: base-x 3.0.7, DOMpurify 2.0.7 & Showdown 1.9.1 + * FIXED: HTML injection via unescaped attachment filename (#554) + * FIXED: Password disabling option (#527) + * **1.2.2 (2020-01-11)** + * CHANGED: Upgrading libraries to: bootstrap 3.4.1, DOMpurify 2.0.7, jQuery 3.4.1, kjua 0.6.0, Showdown 1.9.1 & SJCL 1.0.8 + * FIXED: HTML injection via unescaped attachment filename (#554) + * **1.3.1 (2019-09-22)** + * ADDED: Translation for Bulgarian (#455) + * CHANGED: Improved mobile UI - obscured send button and hard to click shortener button (#477) + * CHANGED: Enhanced URL shortener integration (#479) + * CHANGED: Improved file upload drag & drop UI (#317) + * CHANGED: Increased default size limit from 2 to 10 MiB, switch data from BLOB to MEDIUMBLOB in MySQL (#458) + * CHANGED: Upgrading libraries to: DOMpurify 2.0.1 + * FIXED: Enabling browsers without WASM to create pastes and read uncompressed ones (#454) + * FIXED: Cloning related issues (#489, #491, #493, #494) + * FIXED: Enable file operation only when editing (#497) + * FIXED: Clicking 'New' on a previously submitted paste does not blank address bar (#354) + * FIXED: Clear address bar when create new paste from existing paste (#479) + * FIXED: Discussion section not hiding when new/clone paste is clicked on (#484) + * FIXED: Showdown.js error when posting svg qrcode (#485) + * FIXED: Failed to handle the case where user cancelled attachment selection properly (#487) + * FIXED: Displaying the appropriate errors in older browsers (#508) + * **1.3 (2019-07-09)** + * ADDED: Translation for Czech (#424) + * ADDED: Threat modeled the application (#177) + * ADDED: Made compression configurable (#38) + * CHANGED: Minimum required PHP version is 5.5, due to a change in the identicon library + * CHANGED: Minimum required browser versions are Firefox 54, Chrome 57, Opera 44, Safari 11, Edge 16, due to use of WebCrypto API, async/await, ES6 & WebAssembly features - all Internet Explorer versions are incompatible + * CHANGED: JSON and encryption formats were changed to replace SJCL library by browser integrated WebCrypto API (#28, #74) + * CHANGED: Replaced rawdeflate.js with zlib.wasm to resolve decompression failures and gain compatibility with standard deflate implementations (#193, #260, #328, #434, #440) + * CHANGED: Increase PBKDF2 iterations to 100k (#350) + * CHANGED: Replaced last use of MD5 with Fowler–Noll–Vo checksum which produces the exact length we need for the paste ID (#49) + * CHANGED: Simplified some PHP code & renamed PrivateBin class into Controller, to make MVC pattern use more obvious (#342) + * CHANGED: Upgrading libraries to: identicon 1.2.0, random_compat 2.0.18, jQuery 3.4.1, Showdown 1.9.0, DOMpurify 1.0.11 & kjua 0.6.0 + * FIXED: Prevent Chrome from sending content of paste to Google for translation (#378) + * FIXED: To support attachments larger then 2 MiB in newer Chrome versions, we switched to blob instead of data URIs (#432) + * FIXED: Since Outlook strips trailing equal signs in links, the key in URL hash is now base58 encoded, instead of base64 (#377) + * FIXED: Facebooks started injecting parameters into shared URLs for tracking that lead to inaccessible pastes (#396) + * FIXED: Properly escaped HTML in raw text mode (#358) + * FIXED: Made download links better readable in the dark bootstrap theme (#364) + * FIXED: Allow Letsencrypt bot to access on apache servers (#413) + * **1.2.1 (2018-08-11)** + * ADDED: Add support for mega.nz links in pastes and comments (#331) + * CHANGED: Added some missing Russian translations (#348) + * CHANGED: Minor PHP refactoring: Rename PrivateBin class to Controller, improved logic of some persistence classes (#342) + * CHANGED: Upgrading DOMpurify library to 1.0.7 + * FIXED: Ensure legacy browsers without webcrypto support can't create paste keys with insufficient entropy (#346) + * FIXED: Re-add support for old browsers (Firefox<21, Chrome<31, Safari<7, IE<11), broken in 1.2, will be removed again in 1.3 + * **1.2 (2018-07-22)** + * ADDED: Translations for Spanish, Occitan, Norwegian, Portuguese, Dutch and Hungarian + * ADDED: Option in configuration to change the default "PrivateBin" title of the site + * ADDED: Added display of video, audio & PDF, drag & drop, preview of attachments (#182) + * ADDED: QR code generation (#169) + * ADDED: Introduced DOMpurify library to sanitize generated HTML before display (#183) + * CHANGED: Force JSON request for getting paste data & password retry (#216) + * CHANGED: Minimum required PHP version is 5.4 (#186) + * CHANGED: Shipped .htaccess files were updated for Apache 2.4 (#192) + * CHANGED: Cleanup of bootstrap template variants and moved icons to `img` directory + * CHANGED: Removed option to hide clone button on expiring pastes, since this requires reading the paste for rendering the template, which leaks information on the pastes state + * CHANGED: Upgrading libraries to: SJCL 1.0.7, jQuery 3.3.1, Base64 2.4.5, Showdown 1.8.6, DOMpurify 1.0.5 & Prettify 453bd5f + * CHANGED: Refactored JavaScript code, making it modular with private and public functions, making it much easier to maintain (#178) + * FIXED: To counteract regressions introduced by the refactoring, we finally introduced property based unit testing for the JavaScript code, this caught several regressions, but also some very old bugs not found so far (#32) + * **1.1.1 (2017-10-06)** + * CHANGED: Switched to `.php` file extension for configuration file, to avoid leaking configuration data in unprotected installation. + * **1.1 (2016-12-26)** + * ADDED: Translations for Italian and Russian + * ADDED: Loading message displayed until decryption succeeded for slower (in terms of CPU or network) systems + * ADDED: Dockerfile for docker container creation + * CHANGED: Using modal dialog to request password input instead of native JS input window (#69) + * CHANGED: Suppressed referrer HTTP header sending when following links in a paste or comment (#96) and added additional HTTP headers for XSS mitigation (#91) + * CHANGED: Updated random_compat and jQuery libraries + * FIXED: XSS using JavaScript stored as markdown formatted paste, after clicking on Raw paste button (#137) + * FIXED: Automatic purging deleting non-expiring pastes, when using database store (#149) + * **1.0 (2016-08-25)** + * ADDED: Translations for Slowene and Chinese + * ADDED: re-introduced (optional) URL shortener support, which was removed back in version 0.16 for privacy concerns + * ADDED: Preview tab, helpful for writing markdown code or check the source code rendering + * ADDED: Automatic purging of expired pastes, done on paste creation + * ADDED: Option to disable icons in discussions (will only affect newly created pastes) + * ADDED: Composer support + * CHANGED: Renamed the ZeroBin fork to PrivateBin + * CHANGED: Removed unmaintained RainTPL template engine, replacing the templates with straight forward PHP files + * CHANGED: New logo and favicons + * CHANGED: Upgrading SJCL library to 1.0.4 + * CHANGED: Switched to GCM instead of CCM mode for AES encryption for newly created pastes + * CHANGED: Use backported random bytes function from PHP7 for older PHP versions instead of mcrypt + * CHANGED: Switched to a SHA256 HMAC of the IP in traffic limiter instead of storing it in plain text on the server + * CHANGED: Introduced content security policy header to reduce cross site scripting (XSS) risks + * CHANGED: Added SHA512 subresource integrity hashes for all javascript includes to reduce the risk of manipulated scripts and easier detection of such + * CHANGED: Refactored PHP code to conform to PSR-4 and PSR-2 standards + * CHANGED: Switched to Identicons as the default for comments with nicknames + * CHANGED: Vizhash is now optional and based on (128 byte) SHA512 HMAC instead of (144 byte) combination of MD5, SHA1 and a reversal of that string + * FIXED: Content-type negociation for HTML in certain uncommon browser configurations + * FIXED: JavaScript error displayed before page is loaded or during attachment load + * FIXED: Don't strip space characters at beginning or end of optional password + * FIXED: Various UI glitches in mobile version or on smaller desktops with language menu, button spacing and long URLs + * FIXED: Back button now works as expected after switching to raw text view of a paste + * FIXED: Reactivated second error message above send comment button to ensure its visibility when the main error message is outside the viewport + * FIXED: Raw text now displays original markdown instead of rendered HTML + * FIXED: Removed unused code detected with the help of various code review tools + * FIXED: Table format for PostgreSQL, making it possible to use PostgreSQL as backend in addition to MySQL, SQLite and flat files + * **0.22 (2015-11-09)**: + * ADDED: Tab character input support + * ADDED: Dark bootstrap theme + * ADDED: Option to hide clone button on expiring pastes + * ADDED: Option to set a different default language then English and/or enforce it as the only language + * ADDED: Database now contains version to allow automatic update of structure, only if necessary; removing database structure check on each request + * ADDED: Favicons + * FIXING: Regressions in database layer, prohibiting pastes from being stored + * FIXING: Fixing "missing" comments when they were posted during the same second to the same paste + * FIXING: JS failing when password input disabled + * CHANGED: Switching positions of "New" and "Send" button, highlighting the latter to improve workflow + * CHANGED: Renamed config file to make updates easier + * CHANGED: Switching to JSON-based REST-API + * CHANGED: Database structure to store attachments, allowing larger attachments to be stored (depending on maximum BLOB size of database backend) + * CHANGED: Refactored data model, traffic limiting & request handling + * **0.21.1 (2015-09-21)**: + * FIXING: lost meta data when using DB model instead of flat files + * FIXING: mobile navbar getting triggered on load + * CHANGED: database table "paste" gets automatically extended with a "meta" column + * CHANGED: navbar of "bootstrap" template now spans full width of view port on large screens + * **0.21 (2015-09-19)**: + * ADDED: Translations for German, French and Polish, language selection menu (optional) + * ADDED: File upload and image display support (optional) + * ADDED: Markdown format support + * ADDED: "bootstrap-compact" template that hides some of the options in a drop down menu to ensure the nav bar fitting on one line on smaller screen sizes + * FIXING: Various usability issues with different screen sizes / device types in the "bootstrap" template + * CHANGED: Instead of having different options to enable and preselect certain formats there is now a generic `[formatter_options]` section where formats can be added to the displayed format drop down menu. A `defaultformatter` can be set, it defaults to "plaintext". The `syntaxhighlighting` configuration got deprecated. + * `zerobin.js` got a major refactoring: + * moved from global namespace into anonymous function + * events are no longer set via "onclick" attributes in the templates, but bound by from JS side + * for simpler maintenance the functions were grouped into objects: zerobin (display logic, event handling), filter (compression, +encryption), i18n (translation, counterpart of i18n.php) and helper (stateless utilities) + * Wiki pages were added to address common topics: + * [Upgrading from ZeroBin 0.19 Alpha](https://github.com/PrivateBin/PrivateBin/wiki/Upgrading-from-ZeroBin-0.19-Alpha) + * [Directory of public PrivateBin servers](https://github.com/PrivateBin/PrivateBin/wiki/PrivateBin-Directory) + * [Translation](https://github.com/PrivateBin/PrivateBin/wiki/Translation) + * [Templates](https://github.com/PrivateBin/PrivateBin/wiki/Templates) + * **0.20 (2015-09-03)**: + * ADDED: Password protected pastes (optional) + * ADDED: configuration options for highlighting, password, discussions, expiration times, rate limiting + * ADDED: JSON-only retrieval of paste incl. discussion, used to be able to refresh paste when posting a comment + * ADDED: bootstrap CSS based template + * CHANGED: "Burn after reading" pastes are now deleted only after the paste was successfully decrypted via callback. This prevents accidental deletion by chatbots following URLs and the like. Usage of a password is suggested to ensure only the desired recipient is able to encrypt it. + * CHANGED: the "opendiscussion" option now only controls if the discussion checkbox is preselected. Use "discussion = false" to disable the discussion feature completely (which also removes the checkbox from the template). + * FIXING: Behaviour of several conflicting configuration options. As a general measure unit tests for 9 of the options and all their possible configurations were added via a unit test generator. + * updated JS libraries: jquery to 1.11.3, sjcl to 1.0.2, base64.js to 2.1.9, deflate to 0.5, inflate to 0.3 and prettify to latest + * generally improved documentation, both inline phpdoc / JSdoc source code documentation, as well as Wiki pages on installation, configuration, development and JSON-API + * **Alpha 0.19 (2013-07-05)**: + * Corrected XSS security flaw which affected IE<10. Other browsers were not affected. + * Corrected spacing display in IE<10. + * **Alpha 0.18 (2013-02-24)**: + * ADDED: The resulting URL is automatically selected after pressing "Send". You just have to press CTRL+C. + * ADDED: Automatic syntax highlighting for 53 languages using highlight.js + * ADDED: "5 minutes" and "1 week" expirations. + * ADDED: "Raw text" button. + * jQuery upgraded to 1.9.1 + * sjcl upgraded to GitHub master 2013-02-23 + * base64.js upgraded to 1.7 + * FIXED: Dates in discussion are now proper local dates. + * ADDED: Robot meta tags in HTML to prevent search engines indexing. + * ADDED: Better json checking (including entropy). + * ADDED: Added version to js/css assets URLs in order to prevent some abusive caches to serve an obsolete version of these files when ZeroBin is upgraded. + * "Burn after reading" option has been moved out of Expiration combo to a separate checkbox. Reason is: You can prevent a read-once paste to be available ad vitam eternam on the net. + * **Alpha 0.17 (2013-02-23)**: + * ADDED: Deletion URL. + * small refactoring. + * improved regex checks. + * larger server alt on installation. + * **Alpha 0.16**: + * FIXED minor php warnings. + * FIXED: zerobin.js reformated and properly commented. + * FIXED: Directory structure re-organized. + * CHANGED: URL shortening button was removed. (It was bad for privacy.) + * **Alpha 0.15 (2012-04-20):** + * FIXED: 2 minor corrections to avoid notices in php log. + * FIXED: Sources converted to UTF-8. + * **Alpha 0.14 (2012-04-20):** + * ADDED: GD presence is checked. + * CHANGED: Traffic limiter data files moved to data/ (→easier rights management) + * ADDED: "Burn after reading" implemented. Opening the URL will display the paste and immediately destroy it on server. + * **Alpha 0.13 (2012-04-18):** + * FIXED: ''imageantialias()'' call removed because it's not really usefull and can be a problem on most hosts (if GD is not compiled in php). + * FIXED: $error not properly initialized in index.php + * **Alpha 0.12 (2012-04-18):** + * **DISCUSSIONS !** Now you can enable discussions on your pastes. Of course, posted comments and nickname are also encrypted and the server cannot see them. + * This feature implies a change in storage format. You will have to delete all previous pastes in your ZeroBin. + * Added [[php:vizhash_gd|Vizhash]] as avatars, so you can match posters IP addresses without revealing them. (Same image = same IP). Of course the IP address cannot be deduced from the Vizhash. + * Remaining time before expiration is now displayed. + * Explicit tags were added to CSS and jQuery selectors (eg. div#aaa instead of #aaa) to speed up browser. + * Better cleaning of the URL (to make sure the key is not broken by some stupid redirection service) + * **Alpha 0.11 (2012-04-12):** + * Automatically ignore parameters (such as &utm_source=...) added //after// the anchor by some stupid Web 2.0 services. + * First public release. + * **Alpha 0.10 (2012-04-12):** + * IE9 does not seem to correctly support ''pre-wrap'' either. Special handling mode activated for all version of IE<10. (Note: **ALL other browsers** correctly support this feature.) + * **Alpha 0.9 (2012-04-11):** + * Oh bummer... IE 8 is as shitty as IE6/7: Its does not seem to support ''white-space:pre-wrap'' correctly. I had to activate the special handling mode. I still have to test IE 9. + * **Alpha 0.8 (2012-04-11):** + * Source code not published yet. + * Interface completely redesigned. Icons added. + * Now properly supports IE6/7 (ugly display, but it works. "Clone" button is disabled though.) + * Added one level of depth for storage directories (This is better for higher load servers). + * php version is now checked (min: 5.2.6) + * Better checks on posted json data on server. + * Added "1 year" expiration. + * URLs are now converted to clickable links. This include http, https, ftp and magnet links. + * Clickable links include ''rel="nofollow"'' to discourage SEO. + * On my public service (http://sebsauvage.net/paste/) + * All data will be deleted (you were warned - this is a test service) + * Default paste expiration is now 1 month to prevent clogging-up my host. diff --git a/CREDITS.md b/CREDITS.md new file mode 100644 index 00000000..fec83fa0 --- /dev/null +++ b/CREDITS.md @@ -0,0 +1,48 @@ +# Credits + +## Active contributors + +Simon Rupf - current developer and maintainer +rugk - security review, doc improvment, JS refactoring & various other stuff +R4SAS - python client, compression, blob URI to support larger attachments + +## Past contributions + +Sébastien Sauvage - original idea and main developer + +* Alexey Gladkov - syntax highlighting +* Greg Knaddison - robots.txt +* MrKooky - HTML5 markup, CSS cleanup +* Simon Rupf - WebCrypto, unit tests, current docker containers, MVC, configuration, i18n +* Hexalyse - Password protection +* Viktor Stanchev - File upload support +* azlux - Tab character input support +* Adam Fisher - old Favicons +* rugk - new logo/icons +* Sobak - PSR-4 and PSR-2 refactoring +* Nathaniel Olsen - jQuery upgrade +* Alexander Demenshin - modal password dialog +* PunKeel - first docker container +* thororm - Display of video, audio & PDF, drag & drop, preview of attachments +* Harald Leithner - base58 encoding of key +* Haocen - lots of bugfixes and UI improvements +* Lucas Savva - configurable config file location, NixOS packaging + +## Translations +* Hexalyse - French +* Kuba Niewiarowski - Polish +* Gabbalo - German +* Draky50110 - French +* Filip Muki Dobranić - Slovene +* Jiawei Zhou - Chinese +* Stefano Marty - Italian +* R4SAS - Russian +* Alfredo Fabián Altamirano Tena - Spanish +* Quent-in - Occitan +* idarlund - Norwegian +* Tulio Leao - Portuguese +* Michael van Schaik - Dutch +* Péter Tabajdi - Hungarian +* info-path - Czech +* BigWax - Bulgarian +* AndriiZ - Ukrainian \ No newline at end of file diff --git a/INSTALL.md b/INSTALL.md new file mode 100644 index 00000000..eb2c8ea3 --- /dev/null +++ b/INSTALL.md @@ -0,0 +1,193 @@ +# Installation + +**TL;DR:** Download the +[latest release archive](https://github.com/PrivateBin/PrivateBin/releases/latest) +and extract it in your web hosts folder where you want to install your PrivateBin +instance. We try to provide a mostly safe default configuration, but we urge you to +check the [security section](#hardening-and-security) below and the [configuration +options](#configuration) to adjust as you see fit. + +**NOTE:** See [our FAQ](https://github.com/PrivateBin/PrivateBin/wiki/FAQ#how-can-i-securely-clonedownload-your-project) for information how to securely download the PrivateBin release files. + +### Minimal requirements + +- PHP version 5.5 or above +- _one_ of the following sources of cryptographically safe randomness is required: + - PHP 7 or higher + - [Libsodium](https://download.libsodium.org/libsodium/content/installation/) and it's [PHP extension](https://paragonie.com/book/pecl-libsodium/read/00-intro.md#installing-libsodium) + - open_basedir access to `/dev/urandom` + - mcrypt extension + - com_dotnet extension + + Mcrypt needs to be able to access `/dev/urandom`. This means if `open_basedir` is set, it must include this file. +- GD extension +- some disk space or (optionally) a database supported by [PDO](https://secure.php.net/manual/book.pdo.php) +- ability to create files and folders in the installation directory and the PATH defined in index.php +- A web browser with javascript support + +## Hardening and security + +### Changing the path + +In the index.php you can define a different `PATH`. This is useful to secure your +installation. You can move the configuration, data files, templates and PHP +libraries (directories cfg, doc, data, lib, tpl, tst and vendor) outside of your +document root. This new location must still be accessible to your webserver / PHP +process (see also +[open_basedir setting](https://secure.php.net/manual/en/ini.core.php#ini.open-basedir)). + +> #### PATH Example +> Your PrivateBin installation lives in a subfolder called "paste" inside of +> your document root. The URL looks like this: +> http://example.com/paste/ +> +> The full path of PrivateBin on your webserver is: +> /home/example.com/htdocs/paste +> +> When setting the path like this: +> define('PATH', '../../secret/privatebin/'); +> +> PrivateBin will look for your includes / data here: +> /home/example.com/secret/privatebin + +### Changing the config path only + +In situations where you want to keep the PrivateBin static files separate from the +rest of your data, or you want to reuse the installation files on multiple vhosts, +you may only want to change the `conf.php`. In this instance, you can set the +`CONFIG_PATH` environment variable to the absolute path to the `conf.php` file. +This can be done in your web server's virtual host config, the PHP config, or in +the index.php if you choose to customize it. + +Note that your PHP process will need read access to the config wherever it may be. + +> #### CONFIG_PATH example +> Setting the value in an Apache Vhost: +> SetEnv CONFIG_PATH /var/lib/privatebin/conf.php +> +> In a php-fpm pool config: +> env[CONFIG_PATH] = /var/lib/privatebin/conf.php +> +> In the index.php, near the top: +> putenv('CONFIG_PATH=/var/lib/privatebin/conf.php'); + +### Transport security + +When setting up PrivateBin, also set up HTTPS, if you haven't already. Without HTTPS +PrivateBin is not secure, as the javascript files could be manipulated during transmission. +For more information on this, see our [FAQ entry on HTTPS setup](https://github.com/PrivateBin/PrivateBin/wiki/FAQ#how-should-i-setup-https). + +### File-level permissions + +After completing the installation, you should make sure, other users on the system cannot read the config file or the `data/` directory, as – depending on your configuration – potential secret information are saved there. + +See [this FAQ item](https://github.com/PrivateBin/PrivateBin/wiki/FAQ#what-are-the-recommended-file-and-folder-permissions-for-privatebin) for a detailed guide on how to "harden" the permissions of files and folders. + +## Configuration + +In the file `cfg/conf.php` you can configure PrivateBin. A `cfg/conf.sample.php` +is provided containing all options and default values. You can copy it to +`cfg/conf.php` and adapt it as needed. Alternatively you can copy it anywhere and +set the `CONFIG_PATH` environment variable (see above notes). The config file is +divided into multiple sections, which are enclosed in square brackets. + +In the `[main]` section you can enable or disable the discussion feature, set +the limit of stored pastes and comments in bytes. The `[traffic]` section lets +you set a time limit in seconds. Users may not post more often then this limit +to your PrivateBin installation. + +More details can be found in the +[configuration documentation](https://github.com/PrivateBin/PrivateBin/wiki/Configuration). + +## Advanced installation + +### Web server configuration + +A `robots.txt` file is provided in the root dir of PrivateBin. It disallows all +robots from accessing your pastes. It is recommend to place it into the root of +your web directory if you have installed PrivateBin in a subdirectory. Make sure +to adjust it, so that the file paths match your installation. Of course also +adjust the file if you already use a `robots.txt`. + +A `.htaccess.disabled` file is provided in the root dir of PrivateBin. It blocks +some known robots and link-scanning bots. If you use Apache, you can rename the +file to `.htaccess` to enable this feature. If you use another webserver, you +have to configure it manually to do the same. + +### When using Cloudflare + +If you want to use PrivateBin behind Cloudflare, make sure you have disabled the Rocket +loader and unchecked "Javascript" for Auto Minify, found in your domain settings, +under "Speed". (More information +[in this FAQ entry](https://github.com/PrivateBin/PrivateBin/wiki/FAQ#user-content-how-to-make-privatebin-work-when-using-cloudflare-for-ddos-protection)) + +### Using a database instead of flat files + +In the configuration file the `[model]` and `[model_options]` sections let you +configure your favourite way of storing the pastes and discussions on your +server. + +`Filesystem` is the default model, which stores everything in files in the +data folder. This is the recommended setup for most sites. + +Under high load, in distributed setups or if you are not allowed to store files +locally, you might want to switch to the `Database` model. This lets you +store your data in a database. Basically all databases that are supported by +[PDO](https://secure.php.net/manual/en/book.pdo.php) may be used. Automatic table +creation is provided for `pdo_ibm`, `pdo_informix`, `pdo_mssql`, `pdo_mysql`, +`pdo_oci`, `pdo_pgsql` and `pdo_sqlite`. You may want to provide a table prefix, +if you have to share the PrivateBin database with another application or you want +to use a prefix for +[security reasons](https://security.stackexchange.com/questions/119510/is-using-a-db-prefix-for-tables-more-secure). +The table prefix option is called `tbl`. + +> #### Note +> The `Database` model has only been tested with SQLite, MySQL and PostgreSQL, +> although it would not be recommended to use SQLite in a production environment. +> If you gain any experience running PrivateBin on other RDBMS, please let us +> know. + +The following GRANTs (privileges) are required for the PrivateBin user in **MySQL**. In normal operation: +- INSERT, SELECT, DELETE on the paste and comment tables +- SELECT on the config table + +If you want PrivateBin to handle table creation (when you create the first paste) and updates (after you update PrivateBin to a new release), you need to give the user these additional privileges: +- CREATE, INDEX and ALTER on the database +- INSERT and UPDATE on the config table + +For reference or if you want to create the table schema for yourself to avoid having to give PrivateBin too many permissions (replace +`prefix_` with your own table prefix and create the table schema with your favourite MySQL console): + +```sql +CREATE TABLE prefix_paste ( + dataid CHAR(16) NOT NULL, + data MEDIUMBLOB, + postdate INT, + expiredate INT, + opendiscussion INT, + burnafterreading INT, + meta TEXT, + attachment MEDIUMBLOB, + attachmentname BLOB, + PRIMARY KEY (dataid) +); + +CREATE TABLE prefix_comment ( + dataid CHAR(16), + pasteid CHAR(16), + parentid CHAR(16), + data BLOB, + nickname BLOB, + vizhash BLOB, + postdate INT, + PRIMARY KEY (dataid) +); +CREATE INDEX parent ON prefix_comment(pasteid); + +CREATE TABLE prefix_config ( + id CHAR(16) NOT NULL, value TEXT, PRIMARY KEY (id) +); +INSERT INTO prefix_config VALUES('VERSION', '1.3.2'); +``` + +In **PostgreSQL**, the data, attachment, nickname and vizhash columns needs to be TEXT and not BLOB or MEDIUMBLOB. diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 00000000..eecdf6cf --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,818 @@ +# License + +PrivateBin consists of PHP and JS code which was originally written by Sébastien +Sauvage in 2012 and falls unter the Zlib/libpng license. Also included are +libraries that fall under the GPLv2 (rawinflate), BSD 3-clause (Showdown), MIT +(base64.js version 1.7, Bootstrap, Identicon, random_compat, composer, kjua, +base-x), Apache (prettify.js) and CC-BY (favicon, icon, logo) licenses. All of +these license terms can be found here below: + +## Zlib/libpng license for PrivateBin and zlib + +Copyright © 2012 Sébastien Sauvage +Copyright © 1995-2017 Jean-loup Gailly and Mark Adler + +This software is provided 'as-is', without any express or implied warranty. In +no event will the authors be held liable for any damages arising from the use +of this software. + +Permission is granted to anyone to use this software for any purpose, including +commercial applications, and to alter it and redistribute it freely, subject to +the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim + that you wrote the original software. If you use this software in a product, + an acknowledgment in the product documentation would be appreciated but is + not required. + +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + +3. This notice may not be removed or altered from any source distribution. + +## GNU General Public License, version 2.0, for rawinflate + +_Version 2, June 1991_ +_Copyright © 1989, 1991 Free Software Foundation, Inc.,_ +_51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA_ + +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. + +### Preamble + +The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + +When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + +To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + +For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + +We protect your rights with two steps: **(1)** copyright the software, and +**(2)** offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + +Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + +Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + +The precise terms and conditions for copying, distribution and +modification follow. + +### TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +**0.** This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The “Program”, below, +refers to any such program or work, and a “work based on the Program” +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term “modification”.) Each licensee is addressed as “you”. + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + +**1.** You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + +**2.** You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + +* **a)** You must cause the modified files to carry prominent notices +stating that you changed the files and the date of any change. +* **b)** You must cause any work that you distribute or publish, that in +whole or in part contains or is derived from the Program or any +part thereof, to be licensed as a whole at no charge to all third +parties under the terms of this License. +* **c)** If the modified program normally reads commands interactively +when run, you must cause it, when started running for such +interactive use in the most ordinary way, to print or display an +announcement including an appropriate copyright notice and a +notice that there is no warranty (or else, saying that you provide +a warranty) and that users may redistribute the program under +these conditions, and telling the user how to view a copy of this +License. (Exception: if the Program itself is interactive but +does not normally print such an announcement, your work based on +the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + +**3.** You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + +* **a)** Accompany it with the complete corresponding machine-readable +source code, which must be distributed under the terms of Sections +1 and 2 above on a medium customarily used for software interchange; or, +* **b)** Accompany it with a written offer, valid for at least three +years, to give any third party, for a charge no more than your +cost of physically performing source distribution, a complete +machine-readable copy of the corresponding source code, to be +distributed under the terms of Sections 1 and 2 above on a medium +customarily used for software interchange; or, +* **c)** Accompany it with the information you received as to the offer +to distribute corresponding source code. (This alternative is +allowed only for noncommercial distribution and only if you +received the program in object code or executable form with such +an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + +**4.** You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + +**5.** You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + +**6.** Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + +**7.** If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + +**8.** If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + +**9.** The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and “any +later version”, you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + +**10.** If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + +### NO WARRANTY + +**11.** BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + +**12.** IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + +END OF TERMS AND CONDITIONS + +## BSD 3-Clause License for Showdown + +Showdown Copyright © 2007, John Fraser + +All rights reserved. + +Original Markdown copyright © 2004, John Gruber + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name "Markdown" nor the names of its contributors may be used + to endorse or promote products derived from this software without specific + prior written permission. + +This software is provided by the copyright holders and contributors "as is" and +any express or implied warranties, including, but not limited to, the implied +warranties of merchantability and fitness for a particular purpose are +disclaimed. In no event shall the copyright owner or contributors be liable for +any direct, indirect, incidental, special, exemplary, or consequential damages +(including, but not limited to, procurement of substitute goods or services; +loss of use, data, or profits; or business interruption) however caused and on +any theory of liability, whether in contract, strict liability, or tort +(including negligence or otherwise) arising in any way out of the use of this +software, even if advised of the possibility of such damage. + +## MIT License for base64.js version 1.7, Bootstrap, Identicon, random_compat, Composer, kjua and base-x + +Copyright © 2012 Dan Kogai +Copyright © 2011-2016 Twitter, Inc. +Copyright © 2013 Benjamin Laugueux +Copyright © 2015 Paragon Initiative Enterprises +Copyright © 2016 Nils Adermann, Jordi Boggiano +Copyright © 2016 Lars Jung (https://larsjung.de) +Copyright © 2018 base-x contributors +Copyright © 2014-2018 The Bitcoin Core developers + +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. + +## Apache License for prettify.js + +_Version 2.0, January 2004_ +__ + +### Terms and Conditions for use, reproduction, and distribution + +#### 1. Definitions + +“License” shall mean the terms and conditions for use, reproduction, and +distribution as defined by Sections 1 through 9 of this document. + +“Licensor” shall mean the copyright owner or entity authorized by the copyright +owner that is granting the License. + +“Legal Entity” shall mean the union of the acting entity and all other entities +that control, are controlled by, or are under common control with that entity. +For the purposes of this definition, “control” means **(i)** the power, direct or +indirect, to cause the direction or management of such entity, whether by +contract or otherwise, or **(ii)** ownership of fifty percent (50%) or more of the +outstanding shares, or **(iii)** beneficial ownership of such entity. + +“You” (or “Your”) shall mean an individual or Legal Entity exercising +permissions granted by this License. + +“Source” form shall mean the preferred form for making modifications, including +but not limited to software source code, documentation source, and configuration +files. + +“Object” form shall mean any form resulting from mechanical transformation or +translation of a Source form, including but not limited to compiled object code, +generated documentation, and conversions to other media types. + +“Work” shall mean the work of authorship, whether in Source or Object form, made +available under the License, as indicated by a copyright notice that is included +in or attached to the work (an example is provided in the Appendix below). + +“Derivative Works” shall mean any work, whether in Source or Object form, that +is based on (or derived from) the Work and for which the editorial revisions, +annotations, elaborations, or other modifications represent, as a whole, an +original work of authorship. For the purposes of this License, Derivative Works +shall not include works that remain separable from, or merely link (or bind by +name) to the interfaces of, the Work and Derivative Works thereof. + +“Contribution” shall mean any work of authorship, including the original version +of the Work and any modifications or additions to that Work or Derivative Works +thereof, that is intentionally submitted to Licensor for inclusion in the Work +by the copyright owner or by an individual or Legal Entity authorized to submit +on behalf of the copyright owner. For the purposes of this definition, +“submitted” means any form of electronic, verbal, or written communication sent +to the Licensor or its representatives, including but not limited to +communication on electronic mailing lists, source code control systems, and +issue tracking systems that are managed by, or on behalf of, the Licensor for +the purpose of discussing and improving the Work, but excluding communication +that is conspicuously marked or otherwise designated in writing by the copyright +owner as “Not a Contribution.” + +“Contributor” shall mean Licensor and any individual or Legal Entity on behalf +of whom a Contribution has been received by Licensor and subsequently +incorporated within the Work. + +#### 2. Grant of Copyright License + +Subject to the terms and conditions of this License, each Contributor hereby +grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, +irrevocable copyright license to reproduce, prepare Derivative Works of, +publicly display, publicly perform, sublicense, and distribute the Work and such +Derivative Works in Source or Object form. + +#### 3. Grant of Patent License + +Subject to the terms and conditions of this License, each Contributor hereby +grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, +irrevocable (except as stated in this section) patent license to make, have +made, use, offer to sell, sell, import, and otherwise transfer the Work, where +such license applies only to those patent claims licensable by such Contributor +that are necessarily infringed by their Contribution(s) alone or by combination +of their Contribution(s) with the Work to which such Contribution(s) was +submitted. If You institute patent litigation against any entity (including a +cross-claim or counterclaim in a lawsuit) alleging that the Work or a +Contribution incorporated within the Work constitutes direct or contributory +patent infringement, then any patent licenses granted to You under this License +for that Work shall terminate as of the date such litigation is filed. + +#### 4. Redistribution + +You may reproduce and distribute copies of the Work or Derivative Works thereof +in any medium, with or without modifications, and in Source or Object form, +provided that You meet the following conditions: + +* **(a)** You must give any other recipients of the Work or Derivative Works a +copy of this License; and +* **(b)** You must cause any modified files to carry prominent notices stating +that You changed the files; and +* **(c)** You must retain, in the Source form of any Derivative Works that You +distribute, all copyright, patent, trademark, and attribution notices from the +Source form of the Work, excluding those notices that do not pertain to any part +of the Derivative Works; and +* **(d)** If the Work includes a “NOTICE” text file as part of its distribution, +then any Derivative Works that You distribute must include a readable copy of the +attribution notices contained within such NOTICE file, excluding those notices +that do not pertain to any part of the Derivative Works, in at least one of the +following places: within a NOTICE text file distributed as part of the +Derivative Works; within the Source form or documentation, if provided along +with the Derivative Works; or, within a display generated by the Derivative +Works, if and wherever such third-party notices normally appear. The contents of +the NOTICE file are for informational purposes only and do not modify the +License. You may add Your own attribution notices within Derivative Works that +You distribute, alongside or as an addendum to the NOTICE text from the Work, +provided that such additional attribution notices cannot be construed as +modifying the License. + +You may add Your own copyright statement to Your modifications and may provide +additional or different license terms and conditions for use, reproduction, or +distribution of Your modifications, or for any such Derivative Works as a whole, +provided Your use, reproduction, and distribution of the Work otherwise complies +with the conditions stated in this License. + +#### 5. Submission of Contributions + +Unless You explicitly state otherwise, any Contribution intentionally submitted +for inclusion in the Work by You to the Licensor shall be under the terms and +conditions of this License, without any additional terms or conditions. +Notwithstanding the above, nothing herein shall supersede or modify the terms of +any separate license agreement you may have executed with Licensor regarding +such Contributions. + +#### 6. Trademarks + +This License does not grant permission to use the trade names, trademarks, +service marks, or product names of the Licensor, except as required for +reasonable and customary use in describing the origin of the Work and +reproducing the content of the NOTICE file. + +#### 7. Disclaimer of Warranty + +Unless required by applicable law or agreed to in writing, Licensor provides the +Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, +including, without limitation, any warranties or conditions of TITLE, +NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are +solely responsible for determining the appropriateness of using or +redistributing the Work and assume any risks associated with Your exercise of +permissions under this License. + +#### 8. Limitation of Liability + +In no event and under no legal theory, whether in tort (including negligence), +contract, or otherwise, unless required by applicable law (such as deliberate +and grossly negligent acts) or agreed to in writing, shall any Contributor be +liable to You for damages, including any direct, indirect, special, incidental, +or consequential damages of any character arising as a result of this License or +out of the use or inability to use the Work (including but not limited to +damages for loss of goodwill, work stoppage, computer failure or malfunction, or +any and all other commercial damages or losses), even if such Contributor has +been advised of the possibility of such damages. + +#### 9. Accepting Warranty or Additional Liability + +While redistributing the Work or Derivative Works thereof, You may choose to +offer, and charge a fee for, acceptance of support, warranty, indemnity, or +other liability obligations and/or rights consistent with this License. However, +in accepting such obligations, You may act only on Your own behalf and on Your +sole responsibility, not on behalf of any other Contributor, and only if You +agree to indemnify, defend, and hold each Contributor harmless for any liability +incurred by, or claims asserted against, such Contributor by reason of your +accepting any such warranty or additional liability. + +## [Creative Commons Attribution 4.0 International Public License](https://creativecommons.org/licenses/by/4.0/) for [PrivateBin favicons, icons & logos](https://github.com/PrivateBin/assets) by [rugk](https://github.com/rugk) + +By exercising the Licensed Rights (defined below), You accept and agree to be +bound by the terms and conditions of this Creative Commons Attribution 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. + +### Section 1 – Definitions. + +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. __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. + +d. __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. + +e. __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. + +f. __Licensed Material__ means the artistic or literary work, database, or other +material to which the Licensor applied this Public License. + +g. __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. + +h. __Licensor__ means the individual(s) or entity(ies) granting rights under +this Public License. + +i. __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. + +j. __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. + +k. __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; and + + B. produce, reproduce, and Share Adapted Material. + + 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. __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. + +### 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. + + 4. If You Share Adapted Material You produce, the Adapter's License You + apply must not prevent recipients of the Adapted Material from complying + with this Public License. + +### 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; + +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; 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. diff --git a/README.md b/README.md new file mode 100644 index 00000000..ff86e973 --- /dev/null +++ b/README.md @@ -0,0 +1,111 @@ +# [![PrivateBin](https://cdn.rawgit.com/PrivateBin/assets/master/images/preview/logoSmall.png)](https://privatebin.info/) + +*Current version: 1.3.2* + +**PrivateBin** is a minimalist, open source online [pastebin](https://en.wikipedia.org/wiki/Pastebin) +where the server has zero knowledge of pasted data. + +Data is encrypted and decrypted in the browser using 256bit AES in [Galois Counter mode](https://en.wikipedia.org/wiki/Galois/Counter_Mode). + +This is a fork of ZeroBin, originally developed by +[Sébastien Sauvage](https://github.com/sebsauvage/ZeroBin). ZeroBin was refactored +to allow easier and cleaner extensions. PrivateBin has many more features than the +original ZeroBin. It is, however, still fully compatible to the original ZeroBin 0.19 +data storage scheme. Therefore, such installations can be upgraded to PrivateBin +without losing any data. + +## What PrivateBin provides + ++ As a server administrator you don't have to worry if your users post content + that is considered illegal in your country. You have no knowledge of any + of the pastes content. If requested or enforced, you can delete any paste from + your system. + ++ Pastebin-like system to store text documents, code samples, etc. + ++ Encryption of data sent to server. + ++ Possibility to set a password which is required to read the paste. It further + protects a paste and prevents people stumbling upon your paste's link + from being able to read it without the password. + +## What it doesn't provide + +- As a user you have to trust the server administrator not to inject any malicious + javascript code. + For basic security, the PrivateBin installation *has to provide HTTPS*! + Otherwise you would also have to trust your internet provider, and any country + the traffic passes through. + Additionally the instance should be secured by + [HSTS](https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security) and + ideally by [HPKP](https://en.wikipedia.org/wiki/HTTP_Public_Key_Pinning) using a + certificate. It can use traditional certificate authorities and/or use + [DNSSEC](https://en.wikipedia.org/wiki/Domain_Name_System_Security_Extensions) + protected + [DANE](https://en.wikipedia.org/wiki/DNS-based_Authentication_of_Named_Entities) + record. + +- The "key" used to encrypt the paste is part of the URL. If you publicly post + the URL of a paste that is not password-protected, anyone can read it. + Use a password if you want your paste to be private. In this case, make sure to + use a strong password and only share it privately and end-to-end-encrypted. + +- A server admin might be forced to hand over access logs to the authorities. + PrivateBin encrypts your text and the discussion contents, but who accessed a + paste (first) might still be disclosed via access logs. + +- In case of a server breach your data is secure as it is only stored encrypted + on the server. However, the server could be misused or the server admin could + be legally forced into sending malicious JavaScript to all web users, which + grabs the decryption key and sends it to the server when a user accesses a + PrivateBin. + Therefore, do not access any PrivateBin instance if you think it has been + compromised. As long as no user accesses this instance with a previously + generated URL, the content can't be decrypted. + +## Options + +Some features are optional and can be enabled or disabled in the [configuration +file](https://github.com/PrivateBin/PrivateBin/wiki/Configuration): + +* Password protection + +* Discussions, anonymous or with nicknames and IP based identicons or vizhashes + +* Expiration times, including a "forever" and "burn after reading" option + +* Markdown format support for HTML formatted pastes, including preview function + +* Syntax highlighting for source code using prettify.js, including 4 prettify + themes + +* File upload support, images get displayed (disabled by default, possibility + to adjust size limit) + +* Templates: By default there are bootstrap CSS, darkstrap and "classic ZeroBin" + to choose from and it is easy to adapt these to your own websites layout or + create your own. + +* Translation system and automatic browser language detection (if enabled in + browser) + +* Language selection (disabled by default, as it uses a session cookie) + +* QR code generation of URL, to easily transfer pastes over to a mobile device + +## Further resources + +* [Installation guide](https://github.com/PrivateBin/PrivateBin/blob/master/INSTALL.md#installation) + +* [Upgrading from ZeroBin 0.19 Alpha](https://github.com/PrivateBin/PrivateBin/wiki/Upgrading-from-ZeroBin-0.19-Alpha) + +* [Configuration guide](https://github.com/PrivateBin/PrivateBin/wiki/Configuration) + +* [Templates](https://github.com/PrivateBin/PrivateBin/wiki/Templates) + +* [Translation guide](https://github.com/PrivateBin/PrivateBin/wiki/Translation) + +* [Developer guide](https://github.com/PrivateBin/PrivateBin/wiki/Development) + +Run into any issues? Have ideas for further developments? Please +[report](https://github.com/PrivateBin/PrivateBin/issues) them! diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 00000000..300f6eea --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,18 @@ +# Security Policy + +## Supported Versions + +| Version | Supported | +| ------- | ------------------ | +| 1.3.2 | :heavy_check_mark: | +| < 1.3.2 | :x: | + +## Reporting a Vulnerability + +You can send us email at security@privatebin.org. You should be able to get +a response within a week (usually during the next weekend). The respondee will +reply from their personal address and can offer you their GPG public key to +support end-to-end encrypted communication on sensitive topics or attachments. + +You can also contact us via the regular issue tracker if the risk of early +publication is low or you would request input from other PrivateBin users. diff --git a/browserconfig.xml b/browserconfig.xml new file mode 100644 index 00000000..7a25581d --- /dev/null +++ b/browserconfig.xml @@ -0,0 +1,11 @@ + + + + + + + + #ffc40d + + + diff --git a/cfg/.htaccess b/cfg/.htaccess new file mode 100644 index 00000000..b66e8088 --- /dev/null +++ b/cfg/.htaccess @@ -0,0 +1 @@ +Require all denied diff --git a/cfg/conf.sample.php b/cfg/conf.sample.php new file mode 100644 index 00000000..d2d285de --- /dev/null +++ b/cfg/conf.sample.php @@ -0,0 +1,175 @@ +;.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:"Glyphicons Halflings";src:url(fonts/glyphicons-halflings-regular.eot);src:url(fonts/glyphicons-halflings-regular.eot?#iefix) format("embedded-opentype"),url(fonts/glyphicons-halflings-regular.woff2) format("woff2"),url(fonts/glyphicons-halflings-regular.woff) format("woff"),url(fonts/glyphicons-halflings-regular.ttf) format("truetype"),url(fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format("svg")}.glyphicon{position:relative;top:1px;display:inline-block;font-family:"Glyphicons Halflings";font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:"\2014 \00A0"}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:""}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:"\00A0 \2014"}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.row-no-gutters{margin-right:0;margin-left:0}.row-no-gutters [class*=col-]{padding-right:0;padding-left:0}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:none;-moz-appearance:none;appearance:none}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s,-webkit-box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=datetime-local].form-control,input[type=month].form-control,input[type=time].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],.input-group-sm input[type=time],input[type=date].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm,input[type=time].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],.input-group-lg input[type=time],input[type=date].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg,input[type=time].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);opacity:.65;-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;background-image:none;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;background-image:none;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;background-image:none;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;background-image:none;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;background-image:none;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;background-image:none;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-right:15px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-right:-15px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);margin-top:8px;margin-bottom:8px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0%;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out,-o-transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.42857143;line-break:auto;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;font-size:12px;filter:alpha(opacity=0);opacity:0}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.42857143;line-break:auto;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;font-size:14px;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover>.arrow{border-width:11px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out,-o-transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);left:0}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);left:0}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;outline:0;filter:alpha(opacity=90);opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:"\2039"}.carousel-control .icon-next:before{content:"\203a"}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} diff --git a/css/bootstrap/bootstrap-theme-3.4.1.css b/css/bootstrap/bootstrap-theme-3.4.1.css new file mode 100644 index 00000000..1e9be12d --- /dev/null +++ b/css/bootstrap/bootstrap-theme-3.4.1.css @@ -0,0 +1,5 @@ +/*! + * Bootstrap v3.4.1 (https://getbootstrap.com/) + * Copyright 2011-2019 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */.btn-danger,.btn-default,.btn-info,.btn-primary,.btn-success,.btn-warning{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-danger.disabled,.btn-danger[disabled],.btn-default.disabled,.btn-default[disabled],.btn-info.disabled,.btn-info[disabled],.btn-primary.disabled,.btn-primary[disabled],.btn-success.disabled,.btn-success[disabled],.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-danger,fieldset[disabled] .btn-default,fieldset[disabled] .btn-info,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-success,fieldset[disabled] .btn-warning{-webkit-box-shadow:none;box-shadow:none}.btn-danger .badge,.btn-default .badge,.btn-info .badge,.btn-primary .badge,.btn-success .badge,.btn-warning .badge{text-shadow:none}.btn.active,.btn:active{background-image:none}.btn-default{background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;text-shadow:0 1px 0 #fff;border-color:#ccc}.btn-default:focus,.btn-default:hover{background-color:#e0e0e0;background-position:0 -15px}.btn-default.active,.btn-default:active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#245580}.btn-primary:focus,.btn-primary:hover{background-color:#265a88;background-position:0 -15px}.btn-primary.active,.btn-primary:active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:focus,.btn-success:hover{background-color:#419641;background-position:0 -15px}.btn-success.active,.btn-success:active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:focus,.btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.btn-info.active,.btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:focus,.btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.btn-warning.active,.btn-warning:active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:focus,.btn-danger:hover{background-color:#c12e2a;background-position:0 -15px}.btn-danger.active,.btn-danger:active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#c12e2a;background-image:none}.img-thumbnail,.thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x;background-color:#e8e8e8}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x;background-color:#2e6da4}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);border-radius:4px}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337ab7 0,#286090 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);background-repeat:repeat-x;border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:focus .badge,.list-group-item.active:hover .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)} diff --git a/css/bootstrap/darkstrap-0.9.3.css b/css/bootstrap/darkstrap-0.9.3.css new file mode 100644 index 00000000..621938e6 --- /dev/null +++ b/css/bootstrap/darkstrap-0.9.3.css @@ -0,0 +1,8061 @@ +@charset "UTF-8"; +/* + * Darkstrap v0.9.3 + * By danneu (https://github.com/danneu/darkstrap) + * Based off Twitter Bootstrap v3.3.5 + */ +/*! + * Bootstrap v3.3.5 (https://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ +html { + font-family: sans-serif; + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; +} + +body { + margin: 0; +} + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} + +audio, +canvas, +progress, +video { + display: inline-block; + vertical-align: baseline; +} + +audio:not([controls]) { + display: none; + height: 0; +} + +[hidden], +template { + display: none; +} + +a { + background-color: transparent; +} + +a:active, +a:hover { + outline: 0; +} + +abbr[title] { + border-bottom: 1px dotted; +} + +b, +strong { + font-weight: bold; +} + +dfn { + font-style: italic; +} + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +mark { + background: #ff0; + color: #000; +} + +small { + font-size: 80%; +} + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +img { + border: 0; +} + +svg:not(:root) { + overflow: hidden; +} + +figure { + margin: 1em 40px; +} + +hr { + box-sizing: content-box; + height: 0; +} + +pre { + overflow: auto; +} + +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} + +button, +input, +optgroup, +select, +textarea { + color: inherit; + font: inherit; + margin: 0; +} + +button { + overflow: visible; +} + +button, +select { + text-transform: none; +} + +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; +} + +button[disabled], +html input[disabled] { + cursor: default; +} + +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} + +input { + line-height: normal; +} + +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; + padding: 0; +} + +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +input[type="search"] { + -webkit-appearance: textfield; + box-sizing: content-box; +} + +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} + +legend { + border: 0; + padding: 0; +} + +textarea { + overflow: auto; +} + +optgroup { + font-weight: bold; +} + +table { + border-collapse: collapse; + border-spacing: 0; +} + +td, +th { + padding: 0; +} + +/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ +@media print { + *, + *:before, + *:after { + background: transparent !important; + color: #000 !important; + box-shadow: none !important; + text-shadow: none !important; + } + + a, + a:visited { + text-decoration: underline; + } + + a[href]:after { + content: " (" attr(href) ")"; + } + + abbr[title]:after { + content: " (" attr(title) ")"; + } + + a[href^="#"]:after, + a[href^="javascript:"]:after { + content: ""; + } + + pre, + blockquote { + border: 1px solid #999; + page-break-inside: avoid; + } + + thead { + display: table-header-group; + } + + tr, + img { + page-break-inside: avoid; + } + + img { + max-width: 100% !important; + } + + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + + h2, + h3 { + page-break-after: avoid; + } + + .navbar { + display: none; + } + + .btn > .caret, + .dropup > .btn > .caret { + border-top-color: #000 !important; + } + + .label { + border: 1px solid #000; + } + + .table { + border-collapse: collapse !important; + } + .table td, + .table th { + background-color: #fff !important; + } + + .table-bordered th, + .table-bordered td { + border: 1px solid #ddd !important; + } +} +@font-face { + font-family: 'Glyphicons Halflings'; + src: url(fonts/glyphicons-halflings-regular.eot?1445975532); + src: url(fonts/glyphicons-halflings-regular.eot?&1445975532#iefix) format("embedded-opentype"), url(fonts/glyphicons-halflings-regular.woff2?1445975532) format("woff2"), url(fonts/glyphicons-halflings-regular.woff?1445975532) format("woff"), url(fonts/glyphicons-halflings-regular.ttf?1445975532) format("truetype"), url(fonts/glyphicons-halflings-regular.svg?1445975532#glyphicons_halflingsregular) format("svg"); +} +.glyphicon { + position: relative; + top: 1px; + display: inline-block; + font-family: 'Glyphicons Halflings'; + font-style: normal; + font-weight: normal; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.glyphicon-asterisk:before { + content: "\2a"; +} + +.glyphicon-plus:before { + content: "\2b"; +} + +.glyphicon-euro:before, +.glyphicon-eur:before { + content: "\20ac"; +} + +.glyphicon-minus:before { + content: "\2212"; +} + +.glyphicon-cloud:before { + content: "\2601"; +} + +.glyphicon-envelope:before { + content: "\2709"; +} + +.glyphicon-pencil:before { + content: "\270f"; +} + +.glyphicon-glass:before { + content: "\e001"; +} + +.glyphicon-music:before { + content: "\e002"; +} + +.glyphicon-search:before { + content: "\e003"; +} + +.glyphicon-heart:before { + content: "\e005"; +} + +.glyphicon-star:before { + content: "\e006"; +} + +.glyphicon-star-empty:before { + content: "\e007"; +} + +.glyphicon-user:before { + content: "\e008"; +} + +.glyphicon-film:before { + content: "\e009"; +} + +.glyphicon-th-large:before { + content: "\e010"; +} + +.glyphicon-th:before { + content: "\e011"; +} + +.glyphicon-th-list:before { + content: "\e012"; +} + +.glyphicon-ok:before { + content: "\e013"; +} + +.glyphicon-remove:before { + content: "\e014"; +} + +.glyphicon-zoom-in:before { + content: "\e015"; +} + +.glyphicon-zoom-out:before { + content: "\e016"; +} + +.glyphicon-off:before { + content: "\e017"; +} + +.glyphicon-signal:before { + content: "\e018"; +} + +.glyphicon-cog:before { + content: "\e019"; +} + +.glyphicon-trash:before { + content: "\e020"; +} + +.glyphicon-home:before { + content: "\e021"; +} + +.glyphicon-file:before { + content: "\e022"; +} + +.glyphicon-time:before { + content: "\e023"; +} + +.glyphicon-road:before { + content: "\e024"; +} + +.glyphicon-download-alt:before { + content: "\e025"; +} + +.glyphicon-download:before { + content: "\e026"; +} + +.glyphicon-upload:before { + content: "\e027"; +} + +.glyphicon-inbox:before { + content: "\e028"; +} + +.glyphicon-play-circle:before { + content: "\e029"; +} + +.glyphicon-repeat:before { + content: "\e030"; +} + +.glyphicon-refresh:before { + content: "\e031"; +} + +.glyphicon-list-alt:before { + content: "\e032"; +} + +.glyphicon-lock:before { + content: "\e033"; +} + +.glyphicon-flag:before { + content: "\e034"; +} + +.glyphicon-headphones:before { + content: "\e035"; +} + +.glyphicon-volume-off:before { + content: "\e036"; +} + +.glyphicon-volume-down:before { + content: "\e037"; +} + +.glyphicon-volume-up:before { + content: "\e038"; +} + +.glyphicon-qrcode:before { + content: "\e039"; +} + +.glyphicon-barcode:before { + content: "\e040"; +} + +.glyphicon-tag:before { + content: "\e041"; +} + +.glyphicon-tags:before { + content: "\e042"; +} + +.glyphicon-book:before { + content: "\e043"; +} + +.glyphicon-bookmark:before { + content: "\e044"; +} + +.glyphicon-print:before { + content: "\e045"; +} + +.glyphicon-camera:before { + content: "\e046"; +} + +.glyphicon-font:before { + content: "\e047"; +} + +.glyphicon-bold:before { + content: "\e048"; +} + +.glyphicon-italic:before { + content: "\e049"; +} + +.glyphicon-text-height:before { + content: "\e050"; +} + +.glyphicon-text-width:before { + content: "\e051"; +} + +.glyphicon-align-left:before { + content: "\e052"; +} + +.glyphicon-align-center:before { + content: "\e053"; +} + +.glyphicon-align-right:before { + content: "\e054"; +} + +.glyphicon-align-justify:before { + content: "\e055"; +} + +.glyphicon-list:before { + content: "\e056"; +} + +.glyphicon-indent-left:before { + content: "\e057"; +} + +.glyphicon-indent-right:before { + content: "\e058"; +} + +.glyphicon-facetime-video:before { + content: "\e059"; +} + +.glyphicon-picture:before { + content: "\e060"; +} + +.glyphicon-map-marker:before { + content: "\e062"; +} + +.glyphicon-adjust:before { + content: "\e063"; +} + +.glyphicon-tint:before { + content: "\e064"; +} + +.glyphicon-edit:before { + content: "\e065"; +} + +.glyphicon-share:before { + content: "\e066"; +} + +.glyphicon-check:before { + content: "\e067"; +} + +.glyphicon-move:before { + content: "\e068"; +} + +.glyphicon-step-backward:before { + content: "\e069"; +} + +.glyphicon-fast-backward:before { + content: "\e070"; +} + +.glyphicon-backward:before { + content: "\e071"; +} + +.glyphicon-play:before { + content: "\e072"; +} + +.glyphicon-pause:before { + content: "\e073"; +} + +.glyphicon-stop:before { + content: "\e074"; +} + +.glyphicon-forward:before { + content: "\e075"; +} + +.glyphicon-fast-forward:before { + content: "\e076"; +} + +.glyphicon-step-forward:before { + content: "\e077"; +} + +.glyphicon-eject:before { + content: "\e078"; +} + +.glyphicon-chevron-left:before { + content: "\e079"; +} + +.glyphicon-chevron-right:before { + content: "\e080"; +} + +.glyphicon-plus-sign:before { + content: "\e081"; +} + +.glyphicon-minus-sign:before { + content: "\e082"; +} + +.glyphicon-remove-sign:before { + content: "\e083"; +} + +.glyphicon-ok-sign:before { + content: "\e084"; +} + +.glyphicon-question-sign:before { + content: "\e085"; +} + +.glyphicon-info-sign:before { + content: "\e086"; +} + +.glyphicon-screenshot:before { + content: "\e087"; +} + +.glyphicon-remove-circle:before { + content: "\e088"; +} + +.glyphicon-ok-circle:before { + content: "\e089"; +} + +.glyphicon-ban-circle:before { + content: "\e090"; +} + +.glyphicon-arrow-left:before { + content: "\e091"; +} + +.glyphicon-arrow-right:before { + content: "\e092"; +} + +.glyphicon-arrow-up:before { + content: "\e093"; +} + +.glyphicon-arrow-down:before { + content: "\e094"; +} + +.glyphicon-share-alt:before { + content: "\e095"; +} + +.glyphicon-resize-full:before { + content: "\e096"; +} + +.glyphicon-resize-small:before { + content: "\e097"; +} + +.glyphicon-exclamation-sign:before { + content: "\e101"; +} + +.glyphicon-gift:before { + content: "\e102"; +} + +.glyphicon-leaf:before { + content: "\e103"; +} + +.glyphicon-fire:before { + content: "\e104"; +} + +.glyphicon-eye-open:before { + content: "\e105"; +} + +.glyphicon-eye-close:before { + content: "\e106"; +} + +.glyphicon-warning-sign:before { + content: "\e107"; +} + +.glyphicon-plane:before { + content: "\e108"; +} + +.glyphicon-calendar:before { + content: "\e109"; +} + +.glyphicon-random:before { + content: "\e110"; +} + +.glyphicon-comment:before { + content: "\e111"; +} + +.glyphicon-magnet:before { + content: "\e112"; +} + +.glyphicon-chevron-up:before { + content: "\e113"; +} + +.glyphicon-chevron-down:before { + content: "\e114"; +} + +.glyphicon-retweet:before { + content: "\e115"; +} + +.glyphicon-shopping-cart:before { + content: "\e116"; +} + +.glyphicon-folder-close:before { + content: "\e117"; +} + +.glyphicon-folder-open:before { + content: "\e118"; +} + +.glyphicon-resize-vertical:before { + content: "\e119"; +} + +.glyphicon-resize-horizontal:before { + content: "\e120"; +} + +.glyphicon-hdd:before { + content: "\e121"; +} + +.glyphicon-bullhorn:before { + content: "\e122"; +} + +.glyphicon-bell:before { + content: "\e123"; +} + +.glyphicon-certificate:before { + content: "\e124"; +} + +.glyphicon-thumbs-up:before { + content: "\e125"; +} + +.glyphicon-thumbs-down:before { + content: "\e126"; +} + +.glyphicon-hand-right:before { + content: "\e127"; +} + +.glyphicon-hand-left:before { + content: "\e128"; +} + +.glyphicon-hand-up:before { + content: "\e129"; +} + +.glyphicon-hand-down:before { + content: "\e130"; +} + +.glyphicon-circle-arrow-right:before { + content: "\e131"; +} + +.glyphicon-circle-arrow-left:before { + content: "\e132"; +} + +.glyphicon-circle-arrow-up:before { + content: "\e133"; +} + +.glyphicon-circle-arrow-down:before { + content: "\e134"; +} + +.glyphicon-globe:before { + content: "\e135"; +} + +.glyphicon-wrench:before { + content: "\e136"; +} + +.glyphicon-tasks:before { + content: "\e137"; +} + +.glyphicon-filter:before { + content: "\e138"; +} + +.glyphicon-briefcase:before { + content: "\e139"; +} + +.glyphicon-fullscreen:before { + content: "\e140"; +} + +.glyphicon-dashboard:before { + content: "\e141"; +} + +.glyphicon-paperclip:before { + content: "\e142"; +} + +.glyphicon-heart-empty:before { + content: "\e143"; +} + +.glyphicon-link:before { + content: "\e144"; +} + +.glyphicon-phone:before { + content: "\e145"; +} + +.glyphicon-pushpin:before { + content: "\e146"; +} + +.glyphicon-usd:before { + content: "\e148"; +} + +.glyphicon-gbp:before { + content: "\e149"; +} + +.glyphicon-sort:before { + content: "\e150"; +} + +.glyphicon-sort-by-alphabet:before { + content: "\e151"; +} + +.glyphicon-sort-by-alphabet-alt:before { + content: "\e152"; +} + +.glyphicon-sort-by-order:before { + content: "\e153"; +} + +.glyphicon-sort-by-order-alt:before { + content: "\e154"; +} + +.glyphicon-sort-by-attributes:before { + content: "\e155"; +} + +.glyphicon-sort-by-attributes-alt:before { + content: "\e156"; +} + +.glyphicon-unchecked:before { + content: "\e157"; +} + +.glyphicon-expand:before { + content: "\e158"; +} + +.glyphicon-collapse-down:before { + content: "\e159"; +} + +.glyphicon-collapse-up:before { + content: "\e160"; +} + +.glyphicon-log-in:before { + content: "\e161"; +} + +.glyphicon-flash:before { + content: "\e162"; +} + +.glyphicon-log-out:before { + content: "\e163"; +} + +.glyphicon-new-window:before { + content: "\e164"; +} + +.glyphicon-record:before { + content: "\e165"; +} + +.glyphicon-save:before { + content: "\e166"; +} + +.glyphicon-open:before { + content: "\e167"; +} + +.glyphicon-saved:before { + content: "\e168"; +} + +.glyphicon-import:before { + content: "\e169"; +} + +.glyphicon-export:before { + content: "\e170"; +} + +.glyphicon-send:before { + content: "\e171"; +} + +.glyphicon-floppy-disk:before { + content: "\e172"; +} + +.glyphicon-floppy-saved:before { + content: "\e173"; +} + +.glyphicon-floppy-remove:before { + content: "\e174"; +} + +.glyphicon-floppy-save:before { + content: "\e175"; +} + +.glyphicon-floppy-open:before { + content: "\e176"; +} + +.glyphicon-credit-card:before { + content: "\e177"; +} + +.glyphicon-transfer:before { + content: "\e178"; +} + +.glyphicon-cutlery:before { + content: "\e179"; +} + +.glyphicon-header:before { + content: "\e180"; +} + +.glyphicon-compressed:before { + content: "\e181"; +} + +.glyphicon-earphone:before { + content: "\e182"; +} + +.glyphicon-phone-alt:before { + content: "\e183"; +} + +.glyphicon-tower:before { + content: "\e184"; +} + +.glyphicon-stats:before { + content: "\e185"; +} + +.glyphicon-sd-video:before { + content: "\e186"; +} + +.glyphicon-hd-video:before { + content: "\e187"; +} + +.glyphicon-subtitles:before { + content: "\e188"; +} + +.glyphicon-sound-stereo:before { + content: "\e189"; +} + +.glyphicon-sound-dolby:before { + content: "\e190"; +} + +.glyphicon-sound-5-1:before { + content: "\e191"; +} + +.glyphicon-sound-6-1:before { + content: "\e192"; +} + +.glyphicon-sound-7-1:before { + content: "\e193"; +} + +.glyphicon-copyright-mark:before { + content: "\e194"; +} + +.glyphicon-registration-mark:before { + content: "\e195"; +} + +.glyphicon-cloud-download:before { + content: "\e197"; +} + +.glyphicon-cloud-upload:before { + content: "\e198"; +} + +.glyphicon-tree-conifer:before { + content: "\e199"; +} + +.glyphicon-tree-deciduous:before { + content: "\e200"; +} + +.glyphicon-cd:before { + content: "\e201"; +} + +.glyphicon-save-file:before { + content: "\e202"; +} + +.glyphicon-open-file:before { + content: "\e203"; +} + +.glyphicon-level-up:before { + content: "\e204"; +} + +.glyphicon-copy:before { + content: "\e205"; +} + +.glyphicon-paste:before { + content: "\e206"; +} + +.glyphicon-alert:before { + content: "\e209"; +} + +.glyphicon-equalizer:before { + content: "\e210"; +} + +.glyphicon-king:before { + content: "\e211"; +} + +.glyphicon-queen:before { + content: "\e212"; +} + +.glyphicon-pawn:before { + content: "\e213"; +} + +.glyphicon-bishop:before { + content: "\e214"; +} + +.glyphicon-knight:before { + content: "\e215"; +} + +.glyphicon-baby-formula:before { + content: "\e216"; +} + +.glyphicon-tent:before { + content: "\26fa"; +} + +.glyphicon-blackboard:before { + content: "\e218"; +} + +.glyphicon-bed:before { + content: "\e219"; +} + +.glyphicon-apple:before { + content: "\f8ff"; +} + +.glyphicon-erase:before { + content: "\e221"; +} + +.glyphicon-hourglass:before { + content: "\231b"; +} + +.glyphicon-lamp:before { + content: "\e223"; +} + +.glyphicon-duplicate:before { + content: "\e224"; +} + +.glyphicon-piggy-bank:before { + content: "\e225"; +} + +.glyphicon-scissors:before { + content: "\e226"; +} + +.glyphicon-bitcoin:before { + content: "\e227"; +} + +.glyphicon-btc:before { + content: "\e227"; +} + +.glyphicon-xbt:before { + content: "\e227"; +} + +.glyphicon-yen:before { + content: "\00a5"; +} + +.glyphicon-jpy:before { + content: "\00a5"; +} + +.glyphicon-ruble:before { + content: "\20bd"; +} + +.glyphicon-rub:before { + content: "\20bd"; +} + +.glyphicon-scale:before { + content: "\e230"; +} + +.glyphicon-ice-lolly:before { + content: "\e231"; +} + +.glyphicon-ice-lolly-tasted:before { + content: "\e232"; +} + +.glyphicon-education:before { + content: "\e233"; +} + +.glyphicon-option-horizontal:before { + content: "\e234"; +} + +.glyphicon-option-vertical:before { + content: "\e235"; +} + +.glyphicon-menu-hamburger:before { + content: "\e236"; +} + +.glyphicon-modal-window:before { + content: "\e237"; +} + +.glyphicon-oil:before { + content: "\e238"; +} + +.glyphicon-grain:before { + content: "\e239"; +} + +.glyphicon-sunglasses:before { + content: "\e240"; +} + +.glyphicon-text-size:before { + content: "\e241"; +} + +.glyphicon-text-color:before { + content: "\e242"; +} + +.glyphicon-text-background:before { + content: "\e243"; +} + +.glyphicon-object-align-top:before { + content: "\e244"; +} + +.glyphicon-object-align-bottom:before { + content: "\e245"; +} + +.glyphicon-object-align-horizontal:before { + content: "\e246"; +} + +.glyphicon-object-align-left:before { + content: "\e247"; +} + +.glyphicon-object-align-vertical:before { + content: "\e248"; +} + +.glyphicon-object-align-right:before { + content: "\e249"; +} + +.glyphicon-triangle-right:before { + content: "\e250"; +} + +.glyphicon-triangle-left:before { + content: "\e251"; +} + +.glyphicon-triangle-bottom:before { + content: "\e252"; +} + +.glyphicon-triangle-top:before { + content: "\e253"; +} + +.glyphicon-console:before { + content: "\e254"; +} + +.glyphicon-superscript:before { + content: "\e255"; +} + +.glyphicon-subscript:before { + content: "\e256"; +} + +.glyphicon-menu-left:before { + content: "\e257"; +} + +.glyphicon-menu-right:before { + content: "\e258"; +} + +.glyphicon-menu-down:before { + content: "\e259"; +} + +.glyphicon-menu-up:before { + content: "\e260"; +} + +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +*:before, +*:after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +html { + font-size: 10px; + -webkit-tap-highlight-color: transparent; +} + +body { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 1.42857143; + color: #c6c6c6; + background-color: #2f2f2f; +} + +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} + +a { + color: #08c; + text-decoration: none; +} +a:hover, a:focus { + color: #1ab3ff; + text-decoration: underline; +} +a:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +figure { + margin: 0; +} + +img { + vertical-align: middle; +} + +.img-responsive { + display: block; + max-width: 100%; + height: auto; +} + +.img-rounded { + border-radius: 6px; +} + +.img-thumbnail { + padding: 4px; + line-height: 1.42857143; + background-color: #2f2f2f; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; + display: inline-block; + max-width: 100%; + height: auto; +} + +.img-circle { + border-radius: 50%; +} + +hr { + margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #eeeeee; +} + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} + +.sr-only-focusable:active, .sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; +} + +[role="button"] { + cursor: pointer; +} + +h1, h2, h3, h4, h5, h6, +.h1, .h2, .h3, .h4, .h5, .h6 { + font-family: inherit; + font-weight: 500; + line-height: 1.1; + color: inherit; +} +h1 small, +h1 .small, h2 small, +h2 .small, h3 small, +h3 .small, h4 small, +h4 .small, h5 small, +h5 .small, h6 small, +h6 .small, +.h1 small, +.h1 .small, .h2 small, +.h2 .small, .h3 small, +.h3 .small, .h4 small, +.h4 .small, .h5 small, +.h5 .small, .h6 small, +.h6 .small { + font-weight: normal; + line-height: 1; + color: #777777; +} + +h1, .h1, +h2, .h2, +h3, .h3 { + margin-top: 20px; + margin-bottom: 10px; +} +h1 small, +h1 .small, .h1 small, +.h1 .small, +h2 small, +h2 .small, .h2 small, +.h2 .small, +h3 small, +h3 .small, .h3 small, +.h3 .small { + font-size: 65%; +} + +h4, .h4, +h5, .h5, +h6, .h6 { + margin-top: 10px; + margin-bottom: 10px; +} +h4 small, +h4 .small, .h4 small, +.h4 .small, +h5 small, +h5 .small, .h5 small, +.h5 .small, +h6 small, +h6 .small, .h6 small, +.h6 .small { + font-size: 75%; +} + +h1, .h1 { + font-size: 36px; +} + +h2, .h2 { + font-size: 30px; +} + +h3, .h3 { + font-size: 24px; +} + +h4, .h4 { + font-size: 18px; +} + +h5, .h5 { + font-size: 14px; +} + +h6, .h6 { + font-size: 12px; +} + +p { + margin: 0 0 10px; +} + +.lead { + margin-bottom: 20px; + font-size: 16px; + font-weight: 300; + line-height: 1.4; +} +@media (min-width: 768px) { + .lead { + font-size: 21px; + } +} + +small, +.small { + font-size: 85%; +} + +mark, +.mark { + background-color: #fcf8e3; + padding: .2em; +} + +.text-left { + text-align: left; +} + +.text-right { + text-align: right; +} + +.text-center { + text-align: center; +} + +.text-justify { + text-align: justify; +} + +.text-nowrap { + white-space: nowrap; +} + +.text-lowercase { + text-transform: lowercase; +} + +.text-uppercase, .initialism { + text-transform: uppercase; +} + +.text-capitalize { + text-transform: capitalize; +} + +.text-muted { + color: #777777; +} + +.text-primary { + color: #337ab7; +} + +a.text-primary:hover, +a.text-primary:focus { + color: #286090; +} + +.text-success { + color: #3c763d; +} + +a.text-success:hover, +a.text-success:focus { + color: #2b542c; +} + +.text-info { + color: #31708f; +} + +a.text-info:hover, +a.text-info:focus { + color: #245269; +} + +.text-warning { + color: #8a6d3b; +} + +a.text-warning:hover, +a.text-warning:focus { + color: #66512c; +} + +.text-danger { + color: #a94442; +} + +a.text-danger:hover, +a.text-danger:focus { + color: #843534; +} + +.bg-primary { + color: #fff; +} + +.bg-primary { + background-color: #337ab7; +} + +a.bg-primary:hover, +a.bg-primary:focus { + background-color: #286090; +} + +.bg-success { + background-color: #dff0d8; +} + +a.bg-success:hover, +a.bg-success:focus { + background-color: #c1e2b3; +} + +.bg-info { + background-color: #d9edf7; +} + +a.bg-info:hover, +a.bg-info:focus { + background-color: #afd9ee; +} + +.bg-warning { + background-color: #fcf8e3; +} + +a.bg-warning:hover, +a.bg-warning:focus { + background-color: #f7ecb5; +} + +.bg-danger { + background-color: #f2dede; +} + +a.bg-danger:hover, +a.bg-danger:focus { + background-color: #e4b9b9; +} + +.page-header { + padding-bottom: 9px; + margin: 40px 0 20px; + border-bottom: 1px solid #eeeeee; +} + +ul, +ol { + margin-top: 0; + margin-bottom: 10px; +} +ul ul, +ul ol, +ol ul, +ol ol { + margin-bottom: 0; +} + +.list-unstyled { + padding-left: 0; + list-style: none; +} + +.list-inline { + padding-left: 0; + list-style: none; + margin-left: -5px; +} +.list-inline > li { + display: inline-block; + padding-left: 5px; + padding-right: 5px; +} + +dl { + margin-top: 0; + margin-bottom: 20px; +} + +dt, +dd { + line-height: 1.42857143; +} + +dt { + font-weight: bold; +} + +dd { + margin-left: 0; +} + +.dl-horizontal dd:before, .dl-horizontal dd:after { + content: " "; + display: table; +} +.dl-horizontal dd:after { + clear: both; +} +@media (min-width: 768px) { + .dl-horizontal dt { + float: left; + width: 160px; + clear: left; + text-align: right; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + .dl-horizontal dd { + margin-left: 180px; + } +} + +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #777777; +} + +.initialism { + font-size: 90%; +} + +blockquote { + padding: 10px 20px; + margin: 0 0 20px; + font-size: 17.5px; + border-left: 5px solid #eeeeee; +} +blockquote p:last-child, +blockquote ul:last-child, +blockquote ol:last-child { + margin-bottom: 0; +} +blockquote footer, +blockquote small, +blockquote .small { + display: block; + font-size: 80%; + line-height: 1.42857143; + color: #777777; +} +blockquote footer:before, +blockquote small:before, +blockquote .small:before { + content: '\2014 \00A0'; +} + +.blockquote-reverse, +blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #eeeeee; + border-left: 0; + text-align: right; +} +.blockquote-reverse footer:before, +.blockquote-reverse small:before, +.blockquote-reverse .small:before, +blockquote.pull-right footer:before, +blockquote.pull-right small:before, +blockquote.pull-right .small:before { + content: ''; +} +.blockquote-reverse footer:after, +.blockquote-reverse small:after, +.blockquote-reverse .small:after, +blockquote.pull-right footer:after, +blockquote.pull-right small:after, +blockquote.pull-right .small:after { + content: '\00A0 \2014'; +} + +address { + margin-bottom: 20px; + font-style: normal; + line-height: 1.42857143; +} + +code, +kbd, +pre, +samp { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; +} + +code { + padding: 2px 4px; + font-size: 90%; + color: #c7254e; + background-color: #f9f2f4; + border-radius: 4px; +} + +kbd { + padding: 2px 4px; + font-size: 90%; + color: #fff; + background-color: #333; + border-radius: 3px; + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); +} +kbd kbd { + padding: 0; + font-size: 100%; + font-weight: bold; + box-shadow: none; +} + +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 1.42857143; + word-break: break-all; + word-wrap: break-word; + color: #333333; + background-color: #f5f5f5; + border: 1px solid #ccc; + border-radius: 4px; +} +pre code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border-radius: 0; +} + +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} + +.container { + margin-right: auto; + margin-left: auto; + padding-left: 15px; + padding-right: 15px; +} +.container:before, .container:after { + content: " "; + display: table; +} +.container:after { + clear: both; +} +@media (min-width: 768px) { + .container { + width: 750px; + } +} +@media (min-width: 992px) { + .container { + width: 970px; + } +} +@media (min-width: 1200px) { + .container { + width: 1170px; + } +} + +.container-fluid { + margin-right: auto; + margin-left: auto; + padding-left: 15px; + padding-right: 15px; +} +.container-fluid:before, .container-fluid:after { + content: " "; + display: table; +} +.container-fluid:after { + clear: both; +} + +.row { + margin-left: -15px; + margin-right: -15px; +} +.row:before, .row:after { + content: " "; + display: table; +} +.row:after { + clear: both; +} + +.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { + position: relative; + min-height: 1px; + padding-left: 15px; + padding-right: 15px; +} + +.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { + float: left; +} + +.col-xs-1 { + width: 8.33333333%; +} + +.col-xs-2 { + width: 16.66666667%; +} + +.col-xs-3 { + width: 25%; +} + +.col-xs-4 { + width: 33.33333333%; +} + +.col-xs-5 { + width: 41.66666667%; +} + +.col-xs-6 { + width: 50%; +} + +.col-xs-7 { + width: 58.33333333%; +} + +.col-xs-8 { + width: 66.66666667%; +} + +.col-xs-9 { + width: 75%; +} + +.col-xs-10 { + width: 83.33333333%; +} + +.col-xs-11 { + width: 91.66666667%; +} + +.col-xs-12 { + width: 100%; +} + +.col-xs-pull-0 { + right: auto; +} + +.col-xs-pull-1 { + right: 8.33333333%; +} + +.col-xs-pull-2 { + right: 16.66666667%; +} + +.col-xs-pull-3 { + right: 25%; +} + +.col-xs-pull-4 { + right: 33.33333333%; +} + +.col-xs-pull-5 { + right: 41.66666667%; +} + +.col-xs-pull-6 { + right: 50%; +} + +.col-xs-pull-7 { + right: 58.33333333%; +} + +.col-xs-pull-8 { + right: 66.66666667%; +} + +.col-xs-pull-9 { + right: 75%; +} + +.col-xs-pull-10 { + right: 83.33333333%; +} + +.col-xs-pull-11 { + right: 91.66666667%; +} + +.col-xs-pull-12 { + right: 100%; +} + +.col-xs-push-0 { + left: auto; +} + +.col-xs-push-1 { + left: 8.33333333%; +} + +.col-xs-push-2 { + left: 16.66666667%; +} + +.col-xs-push-3 { + left: 25%; +} + +.col-xs-push-4 { + left: 33.33333333%; +} + +.col-xs-push-5 { + left: 41.66666667%; +} + +.col-xs-push-6 { + left: 50%; +} + +.col-xs-push-7 { + left: 58.33333333%; +} + +.col-xs-push-8 { + left: 66.66666667%; +} + +.col-xs-push-9 { + left: 75%; +} + +.col-xs-push-10 { + left: 83.33333333%; +} + +.col-xs-push-11 { + left: 91.66666667%; +} + +.col-xs-push-12 { + left: 100%; +} + +.col-xs-offset-0 { + margin-left: 0%; +} + +.col-xs-offset-1 { + margin-left: 8.33333333%; +} + +.col-xs-offset-2 { + margin-left: 16.66666667%; +} + +.col-xs-offset-3 { + margin-left: 25%; +} + +.col-xs-offset-4 { + margin-left: 33.33333333%; +} + +.col-xs-offset-5 { + margin-left: 41.66666667%; +} + +.col-xs-offset-6 { + margin-left: 50%; +} + +.col-xs-offset-7 { + margin-left: 58.33333333%; +} + +.col-xs-offset-8 { + margin-left: 66.66666667%; +} + +.col-xs-offset-9 { + margin-left: 75%; +} + +.col-xs-offset-10 { + margin-left: 83.33333333%; +} + +.col-xs-offset-11 { + margin-left: 91.66666667%; +} + +.col-xs-offset-12 { + margin-left: 100%; +} + +@media (min-width: 768px) { + .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { + float: left; + } + + .col-sm-1 { + width: 8.33333333%; + } + + .col-sm-2 { + width: 16.66666667%; + } + + .col-sm-3 { + width: 25%; + } + + .col-sm-4 { + width: 33.33333333%; + } + + .col-sm-5 { + width: 41.66666667%; + } + + .col-sm-6 { + width: 50%; + } + + .col-sm-7 { + width: 58.33333333%; + } + + .col-sm-8 { + width: 66.66666667%; + } + + .col-sm-9 { + width: 75%; + } + + .col-sm-10 { + width: 83.33333333%; + } + + .col-sm-11 { + width: 91.66666667%; + } + + .col-sm-12 { + width: 100%; + } + + .col-sm-pull-0 { + right: auto; + } + + .col-sm-pull-1 { + right: 8.33333333%; + } + + .col-sm-pull-2 { + right: 16.66666667%; + } + + .col-sm-pull-3 { + right: 25%; + } + + .col-sm-pull-4 { + right: 33.33333333%; + } + + .col-sm-pull-5 { + right: 41.66666667%; + } + + .col-sm-pull-6 { + right: 50%; + } + + .col-sm-pull-7 { + right: 58.33333333%; + } + + .col-sm-pull-8 { + right: 66.66666667%; + } + + .col-sm-pull-9 { + right: 75%; + } + + .col-sm-pull-10 { + right: 83.33333333%; + } + + .col-sm-pull-11 { + right: 91.66666667%; + } + + .col-sm-pull-12 { + right: 100%; + } + + .col-sm-push-0 { + left: auto; + } + + .col-sm-push-1 { + left: 8.33333333%; + } + + .col-sm-push-2 { + left: 16.66666667%; + } + + .col-sm-push-3 { + left: 25%; + } + + .col-sm-push-4 { + left: 33.33333333%; + } + + .col-sm-push-5 { + left: 41.66666667%; + } + + .col-sm-push-6 { + left: 50%; + } + + .col-sm-push-7 { + left: 58.33333333%; + } + + .col-sm-push-8 { + left: 66.66666667%; + } + + .col-sm-push-9 { + left: 75%; + } + + .col-sm-push-10 { + left: 83.33333333%; + } + + .col-sm-push-11 { + left: 91.66666667%; + } + + .col-sm-push-12 { + left: 100%; + } + + .col-sm-offset-0 { + margin-left: 0%; + } + + .col-sm-offset-1 { + margin-left: 8.33333333%; + } + + .col-sm-offset-2 { + margin-left: 16.66666667%; + } + + .col-sm-offset-3 { + margin-left: 25%; + } + + .col-sm-offset-4 { + margin-left: 33.33333333%; + } + + .col-sm-offset-5 { + margin-left: 41.66666667%; + } + + .col-sm-offset-6 { + margin-left: 50%; + } + + .col-sm-offset-7 { + margin-left: 58.33333333%; + } + + .col-sm-offset-8 { + margin-left: 66.66666667%; + } + + .col-sm-offset-9 { + margin-left: 75%; + } + + .col-sm-offset-10 { + margin-left: 83.33333333%; + } + + .col-sm-offset-11 { + margin-left: 91.66666667%; + } + + .col-sm-offset-12 { + margin-left: 100%; + } +} +@media (min-width: 992px) { + .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { + float: left; + } + + .col-md-1 { + width: 8.33333333%; + } + + .col-md-2 { + width: 16.66666667%; + } + + .col-md-3 { + width: 25%; + } + + .col-md-4 { + width: 33.33333333%; + } + + .col-md-5 { + width: 41.66666667%; + } + + .col-md-6 { + width: 50%; + } + + .col-md-7 { + width: 58.33333333%; + } + + .col-md-8 { + width: 66.66666667%; + } + + .col-md-9 { + width: 75%; + } + + .col-md-10 { + width: 83.33333333%; + } + + .col-md-11 { + width: 91.66666667%; + } + + .col-md-12 { + width: 100%; + } + + .col-md-pull-0 { + right: auto; + } + + .col-md-pull-1 { + right: 8.33333333%; + } + + .col-md-pull-2 { + right: 16.66666667%; + } + + .col-md-pull-3 { + right: 25%; + } + + .col-md-pull-4 { + right: 33.33333333%; + } + + .col-md-pull-5 { + right: 41.66666667%; + } + + .col-md-pull-6 { + right: 50%; + } + + .col-md-pull-7 { + right: 58.33333333%; + } + + .col-md-pull-8 { + right: 66.66666667%; + } + + .col-md-pull-9 { + right: 75%; + } + + .col-md-pull-10 { + right: 83.33333333%; + } + + .col-md-pull-11 { + right: 91.66666667%; + } + + .col-md-pull-12 { + right: 100%; + } + + .col-md-push-0 { + left: auto; + } + + .col-md-push-1 { + left: 8.33333333%; + } + + .col-md-push-2 { + left: 16.66666667%; + } + + .col-md-push-3 { + left: 25%; + } + + .col-md-push-4 { + left: 33.33333333%; + } + + .col-md-push-5 { + left: 41.66666667%; + } + + .col-md-push-6 { + left: 50%; + } + + .col-md-push-7 { + left: 58.33333333%; + } + + .col-md-push-8 { + left: 66.66666667%; + } + + .col-md-push-9 { + left: 75%; + } + + .col-md-push-10 { + left: 83.33333333%; + } + + .col-md-push-11 { + left: 91.66666667%; + } + + .col-md-push-12 { + left: 100%; + } + + .col-md-offset-0 { + margin-left: 0%; + } + + .col-md-offset-1 { + margin-left: 8.33333333%; + } + + .col-md-offset-2 { + margin-left: 16.66666667%; + } + + .col-md-offset-3 { + margin-left: 25%; + } + + .col-md-offset-4 { + margin-left: 33.33333333%; + } + + .col-md-offset-5 { + margin-left: 41.66666667%; + } + + .col-md-offset-6 { + margin-left: 50%; + } + + .col-md-offset-7 { + margin-left: 58.33333333%; + } + + .col-md-offset-8 { + margin-left: 66.66666667%; + } + + .col-md-offset-9 { + margin-left: 75%; + } + + .col-md-offset-10 { + margin-left: 83.33333333%; + } + + .col-md-offset-11 { + margin-left: 91.66666667%; + } + + .col-md-offset-12 { + margin-left: 100%; + } +} +@media (min-width: 1200px) { + .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { + float: left; + } + + .col-lg-1 { + width: 8.33333333%; + } + + .col-lg-2 { + width: 16.66666667%; + } + + .col-lg-3 { + width: 25%; + } + + .col-lg-4 { + width: 33.33333333%; + } + + .col-lg-5 { + width: 41.66666667%; + } + + .col-lg-6 { + width: 50%; + } + + .col-lg-7 { + width: 58.33333333%; + } + + .col-lg-8 { + width: 66.66666667%; + } + + .col-lg-9 { + width: 75%; + } + + .col-lg-10 { + width: 83.33333333%; + } + + .col-lg-11 { + width: 91.66666667%; + } + + .col-lg-12 { + width: 100%; + } + + .col-lg-pull-0 { + right: auto; + } + + .col-lg-pull-1 { + right: 8.33333333%; + } + + .col-lg-pull-2 { + right: 16.66666667%; + } + + .col-lg-pull-3 { + right: 25%; + } + + .col-lg-pull-4 { + right: 33.33333333%; + } + + .col-lg-pull-5 { + right: 41.66666667%; + } + + .col-lg-pull-6 { + right: 50%; + } + + .col-lg-pull-7 { + right: 58.33333333%; + } + + .col-lg-pull-8 { + right: 66.66666667%; + } + + .col-lg-pull-9 { + right: 75%; + } + + .col-lg-pull-10 { + right: 83.33333333%; + } + + .col-lg-pull-11 { + right: 91.66666667%; + } + + .col-lg-pull-12 { + right: 100%; + } + + .col-lg-push-0 { + left: auto; + } + + .col-lg-push-1 { + left: 8.33333333%; + } + + .col-lg-push-2 { + left: 16.66666667%; + } + + .col-lg-push-3 { + left: 25%; + } + + .col-lg-push-4 { + left: 33.33333333%; + } + + .col-lg-push-5 { + left: 41.66666667%; + } + + .col-lg-push-6 { + left: 50%; + } + + .col-lg-push-7 { + left: 58.33333333%; + } + + .col-lg-push-8 { + left: 66.66666667%; + } + + .col-lg-push-9 { + left: 75%; + } + + .col-lg-push-10 { + left: 83.33333333%; + } + + .col-lg-push-11 { + left: 91.66666667%; + } + + .col-lg-push-12 { + left: 100%; + } + + .col-lg-offset-0 { + margin-left: 0%; + } + + .col-lg-offset-1 { + margin-left: 8.33333333%; + } + + .col-lg-offset-2 { + margin-left: 16.66666667%; + } + + .col-lg-offset-3 { + margin-left: 25%; + } + + .col-lg-offset-4 { + margin-left: 33.33333333%; + } + + .col-lg-offset-5 { + margin-left: 41.66666667%; + } + + .col-lg-offset-6 { + margin-left: 50%; + } + + .col-lg-offset-7 { + margin-left: 58.33333333%; + } + + .col-lg-offset-8 { + margin-left: 66.66666667%; + } + + .col-lg-offset-9 { + margin-left: 75%; + } + + .col-lg-offset-10 { + margin-left: 83.33333333%; + } + + .col-lg-offset-11 { + margin-left: 91.66666667%; + } + + .col-lg-offset-12 { + margin-left: 100%; + } +} +table { + background-color: transparent; +} + +caption { + padding-top: 8px; + padding-bottom: 8px; + color: #777777; + text-align: left; +} + +th { + text-align: left; +} + +.table { + width: 100%; + max-width: 100%; + margin-bottom: 20px; +} +.table > thead > tr > th, +.table > thead > tr > td, +.table > tbody > tr > th, +.table > tbody > tr > td, +.table > tfoot > tr > th, +.table > tfoot > tr > td { + padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border-top: 1px solid #ddd; +} +.table > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid #ddd; +} +.table > caption + thead > tr:first-child > th, +.table > caption + thead > tr:first-child > td, +.table > colgroup + thead > tr:first-child > th, +.table > colgroup + thead > tr:first-child > td, +.table > thead:first-child > tr:first-child > th, +.table > thead:first-child > tr:first-child > td { + border-top: 0; +} +.table > tbody + tbody { + border-top: 2px solid #ddd; +} +.table .table { + background-color: #2f2f2f; +} + +.table-condensed > thead > tr > th, +.table-condensed > thead > tr > td, +.table-condensed > tbody > tr > th, +.table-condensed > tbody > tr > td, +.table-condensed > tfoot > tr > th, +.table-condensed > tfoot > tr > td { + padding: 5px; +} + +.table-bordered { + border: 1px solid #ddd; +} +.table-bordered > thead > tr > th, +.table-bordered > thead > tr > td, +.table-bordered > tbody > tr > th, +.table-bordered > tbody > tr > td, +.table-bordered > tfoot > tr > th, +.table-bordered > tfoot > tr > td { + border: 1px solid #ddd; +} +.table-bordered > thead > tr > th, +.table-bordered > thead > tr > td { + border-bottom-width: 2px; +} + +.table-striped > tbody > tr:nth-of-type(odd) { + background-color: #f9f9f9; +} + +.table-hover > tbody > tr:hover { + background-color: #f5f5f5; +} + +table col[class*="col-"] { + position: static; + float: none; + display: table-column; +} + +table td[class*="col-"], +table th[class*="col-"] { + position: static; + float: none; + display: table-cell; +} + +.table > thead > tr > td.active, +.table > thead > tr > th.active, .table > thead > tr.active > td, .table > thead > tr.active > th, +.table > tbody > tr > td.active, +.table > tbody > tr > th.active, +.table > tbody > tr.active > td, +.table > tbody > tr.active > th, +.table > tfoot > tr > td.active, +.table > tfoot > tr > th.active, +.table > tfoot > tr.active > td, +.table > tfoot > tr.active > th { + background-color: #f5f5f5; +} + +.table-hover > tbody > tr > td.active:hover, +.table-hover > tbody > tr > th.active:hover, .table-hover > tbody > tr.active:hover > td, .table-hover > tbody > tr:hover > .active, .table-hover > tbody > tr.active:hover > th { + background-color: #e8e8e8; +} + +.table > thead > tr > td.success, +.table > thead > tr > th.success, .table > thead > tr.success > td, .table > thead > tr.success > th, +.table > tbody > tr > td.success, +.table > tbody > tr > th.success, +.table > tbody > tr.success > td, +.table > tbody > tr.success > th, +.table > tfoot > tr > td.success, +.table > tfoot > tr > th.success, +.table > tfoot > tr.success > td, +.table > tfoot > tr.success > th { + background-color: #dff0d8; +} + +.table-hover > tbody > tr > td.success:hover, +.table-hover > tbody > tr > th.success:hover, .table-hover > tbody > tr.success:hover > td, .table-hover > tbody > tr:hover > .success, .table-hover > tbody > tr.success:hover > th { + background-color: #d0e9c6; +} + +.table > thead > tr > td.info, +.table > thead > tr > th.info, .table > thead > tr.info > td, .table > thead > tr.info > th, +.table > tbody > tr > td.info, +.table > tbody > tr > th.info, +.table > tbody > tr.info > td, +.table > tbody > tr.info > th, +.table > tfoot > tr > td.info, +.table > tfoot > tr > th.info, +.table > tfoot > tr.info > td, +.table > tfoot > tr.info > th { + background-color: #d9edf7; +} + +.table-hover > tbody > tr > td.info:hover, +.table-hover > tbody > tr > th.info:hover, .table-hover > tbody > tr.info:hover > td, .table-hover > tbody > tr:hover > .info, .table-hover > tbody > tr.info:hover > th { + background-color: #c4e3f3; +} + +.table > thead > tr > td.warning, +.table > thead > tr > th.warning, .table > thead > tr.warning > td, .table > thead > tr.warning > th, +.table > tbody > tr > td.warning, +.table > tbody > tr > th.warning, +.table > tbody > tr.warning > td, +.table > tbody > tr.warning > th, +.table > tfoot > tr > td.warning, +.table > tfoot > tr > th.warning, +.table > tfoot > tr.warning > td, +.table > tfoot > tr.warning > th { + background-color: #fcf8e3; +} + +.table-hover > tbody > tr > td.warning:hover, +.table-hover > tbody > tr > th.warning:hover, .table-hover > tbody > tr.warning:hover > td, .table-hover > tbody > tr:hover > .warning, .table-hover > tbody > tr.warning:hover > th { + background-color: #faf2cc; +} + +.table > thead > tr > td.danger, +.table > thead > tr > th.danger, .table > thead > tr.danger > td, .table > thead > tr.danger > th, +.table > tbody > tr > td.danger, +.table > tbody > tr > th.danger, +.table > tbody > tr.danger > td, +.table > tbody > tr.danger > th, +.table > tfoot > tr > td.danger, +.table > tfoot > tr > th.danger, +.table > tfoot > tr.danger > td, +.table > tfoot > tr.danger > th { + background-color: #f2dede; +} + +.table-hover > tbody > tr > td.danger:hover, +.table-hover > tbody > tr > th.danger:hover, .table-hover > tbody > tr.danger:hover > td, .table-hover > tbody > tr:hover > .danger, .table-hover > tbody > tr.danger:hover > th { + background-color: #ebcccc; +} + +.table-responsive { + overflow-x: auto; + min-height: 0.01%; +} +@media screen and (max-width: 767px) { + .table-responsive { + width: 100%; + margin-bottom: 15px; + overflow-y: hidden; + -ms-overflow-style: -ms-autohiding-scrollbar; + border: 1px solid #ddd; + } + .table-responsive > .table { + margin-bottom: 0; + } + .table-responsive > .table > thead > tr > th, + .table-responsive > .table > thead > tr > td, + .table-responsive > .table > tbody > tr > th, + .table-responsive > .table > tbody > tr > td, + .table-responsive > .table > tfoot > tr > th, + .table-responsive > .table > tfoot > tr > td { + white-space: nowrap; + } + .table-responsive > .table-bordered { + border: 0; + } + .table-responsive > .table-bordered > thead > tr > th:first-child, + .table-responsive > .table-bordered > thead > tr > td:first-child, + .table-responsive > .table-bordered > tbody > tr > th:first-child, + .table-responsive > .table-bordered > tbody > tr > td:first-child, + .table-responsive > .table-bordered > tfoot > tr > th:first-child, + .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; + } + .table-responsive > .table-bordered > thead > tr > th:last-child, + .table-responsive > .table-bordered > thead > tr > td:last-child, + .table-responsive > .table-bordered > tbody > tr > th:last-child, + .table-responsive > .table-bordered > tbody > tr > td:last-child, + .table-responsive > .table-bordered > tfoot > tr > th:last-child, + .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; + } + .table-responsive > .table-bordered > tbody > tr:last-child > th, + .table-responsive > .table-bordered > tbody > tr:last-child > td, + .table-responsive > .table-bordered > tfoot > tr:last-child > th, + .table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; + } +} + +fieldset { + padding: 0; + margin: 0; + border: 0; + min-width: 0; +} + +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: inherit; + color: #333333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} + +label { + display: inline-block; + max-width: 100%; + margin-bottom: 5px; + font-weight: bold; +} + +input[type="search"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + line-height: normal; +} + +input[type="file"] { + display: block; +} + +input[type="range"] { + display: block; + width: 100%; +} + +select[multiple], +select[size] { + height: auto; +} + +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +output { + display: block; + padding-top: 7px; + font-size: 14px; + line-height: 1.42857143; + color: #555555; +} + +.form-control { + display: block; + width: 100%; + height: 34px; + padding: 6px 12px; + font-size: 14px; + line-height: 1.42857143; + color: #555555; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; + -o-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; + transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; +} +.form-control:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); +} +.form-control::-moz-placeholder { + color: #999; + opacity: 1; +} +.form-control:-ms-input-placeholder { + color: #999; +} +.form-control::-webkit-input-placeholder { + color: #999; +} +.form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control { + background-color: #eeeeee; + opacity: 1; +} +.form-control[disabled], fieldset[disabled] .form-control { + cursor: not-allowed; +} + +textarea.form-control { + height: auto; +} + +input[type="search"] { + -webkit-appearance: none; +} + +@media screen and (-webkit-min-device-pixel-ratio: 0) { + input[type="date"].form-control, + input[type="time"].form-control, + input[type="datetime-local"].form-control, + input[type="month"].form-control { + line-height: 34px; + } + input[type="date"].input-sm, .input-group-sm > input[type="date"].form-control, + .input-group-sm > input[type="date"].input-group-addon, + .input-group-sm > .input-group-btn > input[type="date"].btn, .input-group-sm input[type="date"], + input[type="time"].input-sm, + .input-group-sm > input[type="time"].form-control, + .input-group-sm > input[type="time"].input-group-addon, + .input-group-sm > .input-group-btn > input[type="time"].btn, .input-group-sm + input[type="time"], + input[type="datetime-local"].input-sm, + .input-group-sm > input[type="datetime-local"].form-control, + .input-group-sm > input[type="datetime-local"].input-group-addon, + .input-group-sm > .input-group-btn > input[type="datetime-local"].btn, .input-group-sm + input[type="datetime-local"], + input[type="month"].input-sm, + .input-group-sm > input[type="month"].form-control, + .input-group-sm > input[type="month"].input-group-addon, + .input-group-sm > .input-group-btn > input[type="month"].btn, .input-group-sm + input[type="month"] { + line-height: 30px; + } + input[type="date"].input-lg, .input-group-lg > input[type="date"].form-control, + .input-group-lg > input[type="date"].input-group-addon, + .input-group-lg > .input-group-btn > input[type="date"].btn, .input-group-lg input[type="date"], + input[type="time"].input-lg, + .input-group-lg > input[type="time"].form-control, + .input-group-lg > input[type="time"].input-group-addon, + .input-group-lg > .input-group-btn > input[type="time"].btn, .input-group-lg + input[type="time"], + input[type="datetime-local"].input-lg, + .input-group-lg > input[type="datetime-local"].form-control, + .input-group-lg > input[type="datetime-local"].input-group-addon, + .input-group-lg > .input-group-btn > input[type="datetime-local"].btn, .input-group-lg + input[type="datetime-local"], + input[type="month"].input-lg, + .input-group-lg > input[type="month"].form-control, + .input-group-lg > input[type="month"].input-group-addon, + .input-group-lg > .input-group-btn > input[type="month"].btn, .input-group-lg + input[type="month"] { + line-height: 46px; + } +} +.form-group { + margin-bottom: 15px; +} + +.radio, +.checkbox { + position: relative; + display: block; + margin-top: 10px; + margin-bottom: 10px; +} +.radio label, +.checkbox label { + min-height: 20px; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + cursor: pointer; +} + +.radio input[type="radio"], +.radio-inline input[type="radio"], +.checkbox input[type="checkbox"], +.checkbox-inline input[type="checkbox"] { + position: absolute; + margin-left: -20px; + margin-top: 4px \9; +} + +.radio + .radio, +.checkbox + .checkbox { + margin-top: -5px; +} + +.radio-inline, +.checkbox-inline { + position: relative; + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + vertical-align: middle; + font-weight: normal; + cursor: pointer; +} + +.radio-inline + .radio-inline, +.checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; +} + +input[type="radio"][disabled], input[type="radio"].disabled, fieldset[disabled] input[type="radio"], +input[type="checkbox"][disabled], +input[type="checkbox"].disabled, fieldset[disabled] +input[type="checkbox"] { + cursor: not-allowed; +} + +.radio-inline.disabled, fieldset[disabled] .radio-inline, +.checkbox-inline.disabled, fieldset[disabled] +.checkbox-inline { + cursor: not-allowed; +} + +.radio.disabled label, fieldset[disabled] .radio label, +.checkbox.disabled label, fieldset[disabled] +.checkbox label { + cursor: not-allowed; +} + +.form-control-static { + padding-top: 7px; + padding-bottom: 7px; + margin-bottom: 0; + min-height: 34px; +} +.form-control-static.input-lg, .input-group-lg > .form-control-static.form-control, +.input-group-lg > .form-control-static.input-group-addon, +.input-group-lg > .input-group-btn > .form-control-static.btn, .form-control-static.input-sm, .input-group-sm > .form-control-static.form-control, +.input-group-sm > .form-control-static.input-group-addon, +.input-group-sm > .input-group-btn > .form-control-static.btn { + padding-left: 0; + padding-right: 0; +} + +.input-sm, .input-group-sm > .form-control, +.input-group-sm > .input-group-addon, +.input-group-sm > .input-group-btn > .btn { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} + +select.input-sm, .input-group-sm > select.form-control, +.input-group-sm > select.input-group-addon, +.input-group-sm > .input-group-btn > select.btn { + height: 30px; + line-height: 30px; +} + +textarea.input-sm, .input-group-sm > textarea.form-control, +.input-group-sm > textarea.input-group-addon, +.input-group-sm > .input-group-btn > textarea.btn, +select[multiple].input-sm, +.input-group-sm > select[multiple].form-control, +.input-group-sm > select[multiple].input-group-addon, +.input-group-sm > .input-group-btn > select[multiple].btn { + height: auto; +} + +.form-group-sm .form-control { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.form-group-sm select.form-control { + height: 30px; + line-height: 30px; +} +.form-group-sm textarea.form-control, +.form-group-sm select[multiple].form-control { + height: auto; +} +.form-group-sm .form-control-static { + height: 30px; + min-height: 32px; + padding: 6px 10px; + font-size: 12px; + line-height: 1.5; +} + +.input-lg, .input-group-lg > .form-control, +.input-group-lg > .input-group-addon, +.input-group-lg > .input-group-btn > .btn { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} + +select.input-lg, .input-group-lg > select.form-control, +.input-group-lg > select.input-group-addon, +.input-group-lg > .input-group-btn > select.btn { + height: 46px; + line-height: 46px; +} + +textarea.input-lg, .input-group-lg > textarea.form-control, +.input-group-lg > textarea.input-group-addon, +.input-group-lg > .input-group-btn > textarea.btn, +select[multiple].input-lg, +.input-group-lg > select[multiple].form-control, +.input-group-lg > select[multiple].input-group-addon, +.input-group-lg > .input-group-btn > select[multiple].btn { + height: auto; +} + +.form-group-lg .form-control { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +.form-group-lg select.form-control { + height: 46px; + line-height: 46px; +} +.form-group-lg textarea.form-control, +.form-group-lg select[multiple].form-control { + height: auto; +} +.form-group-lg .form-control-static { + height: 46px; + min-height: 38px; + padding: 11px 16px; + font-size: 18px; + line-height: 1.3333333; +} + +.has-feedback { + position: relative; +} +.has-feedback .form-control { + padding-right: 42.5px; +} + +.form-control-feedback { + position: absolute; + top: 0; + right: 0; + z-index: 2; + display: block; + width: 34px; + height: 34px; + line-height: 34px; + text-align: center; + pointer-events: none; +} + +.input-lg + .form-control-feedback, .input-group-lg > .form-control + .form-control-feedback, +.input-group-lg > .input-group-addon + .form-control-feedback, +.input-group-lg > .input-group-btn > .btn + .form-control-feedback, +.input-group-lg + .form-control-feedback, +.form-group-lg .form-control + .form-control-feedback { + width: 46px; + height: 46px; + line-height: 46px; +} + +.input-sm + .form-control-feedback, .input-group-sm > .form-control + .form-control-feedback, +.input-group-sm > .input-group-addon + .form-control-feedback, +.input-group-sm > .input-group-btn > .btn + .form-control-feedback, +.input-group-sm + .form-control-feedback, +.form-group-sm .form-control + .form-control-feedback { + width: 30px; + height: 30px; + line-height: 30px; +} + +.has-success .help-block, +.has-success .control-label, +.has-success .radio, +.has-success .checkbox, +.has-success .radio-inline, +.has-success .checkbox-inline, .has-success.radio label, .has-success.checkbox label, .has-success.radio-inline label, .has-success.checkbox-inline label { + color: #3c763d; +} +.has-success .form-control { + border-color: #3c763d; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-success .form-control:focus { + border-color: #2b542c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; +} +.has-success .input-group-addon { + color: #3c763d; + border-color: #3c763d; + background-color: #dff0d8; +} +.has-success .form-control-feedback { + color: #3c763d; +} + +.has-warning .help-block, +.has-warning .control-label, +.has-warning .radio, +.has-warning .checkbox, +.has-warning .radio-inline, +.has-warning .checkbox-inline, .has-warning.radio label, .has-warning.checkbox label, .has-warning.radio-inline label, .has-warning.checkbox-inline label { + color: #8a6d3b; +} +.has-warning .form-control { + border-color: #8a6d3b; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-warning .form-control:focus { + border-color: #66512c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; +} +.has-warning .input-group-addon { + color: #8a6d3b; + border-color: #8a6d3b; + background-color: #fcf8e3; +} +.has-warning .form-control-feedback { + color: #8a6d3b; +} + +.has-error .help-block, +.has-error .control-label, +.has-error .radio, +.has-error .checkbox, +.has-error .radio-inline, +.has-error .checkbox-inline, .has-error.radio label, .has-error.checkbox label, .has-error.radio-inline label, .has-error.checkbox-inline label { + color: #a94442; +} +.has-error .form-control { + border-color: #a94442; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-error .form-control:focus { + border-color: #843534; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; +} +.has-error .input-group-addon { + color: #a94442; + border-color: #a94442; + background-color: #f2dede; +} +.has-error .form-control-feedback { + color: #a94442; +} + +.has-feedback label ~ .form-control-feedback { + top: 25px; +} +.has-feedback label.sr-only ~ .form-control-feedback { + top: 0; +} + +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: white; +} + +@media (min-width: 768px) { + .form-inline .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .form-inline .form-control-static { + display: inline-block; + } + .form-inline .input-group { + display: inline-table; + vertical-align: middle; + } + .form-inline .input-group .input-group-addon, + .form-inline .input-group .input-group-btn, + .form-inline .input-group .form-control { + width: auto; + } + .form-inline .input-group > .form-control { + width: 100%; + } + .form-inline .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio, + .form-inline .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio label, + .form-inline .checkbox label { + padding-left: 0; + } + .form-inline .radio input[type="radio"], + .form-inline .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .form-inline .has-feedback .form-control-feedback { + top: 0; + } +} + +.form-horizontal .radio, +.form-horizontal .checkbox, +.form-horizontal .radio-inline, +.form-horizontal .checkbox-inline { + margin-top: 0; + margin-bottom: 0; + padding-top: 7px; +} +.form-horizontal .radio, +.form-horizontal .checkbox { + min-height: 27px; +} +.form-horizontal .form-group { + margin-left: -15px; + margin-right: -15px; +} +.form-horizontal .form-group:before, .form-horizontal .form-group:after { + content: " "; + display: table; +} +.form-horizontal .form-group:after { + clear: both; +} +@media (min-width: 768px) { + .form-horizontal .control-label { + text-align: right; + margin-bottom: 0; + padding-top: 7px; + } +} +.form-horizontal .has-feedback .form-control-feedback { + right: 15px; +} +@media (min-width: 768px) { + .form-horizontal .form-group-lg .control-label { + padding-top: 14.333333px; + font-size: 18px; + } +} +@media (min-width: 768px) { + .form-horizontal .form-group-sm .control-label { + padding-top: 6px; + font-size: 12px; + } +} + +.btn { + display: inline-block; + margin-bottom: 0; + font-weight: normal; + text-align: center; + vertical-align: middle; + touch-action: manipulation; + cursor: pointer; + background-image: none; + border: 1px solid transparent; + white-space: nowrap; + padding: 6px 12px; + font-size: 14px; + line-height: 1.42857143; + border-radius: 4px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.btn:focus, .btn.focus, .btn:active:focus, .btn:active.focus, .btn.active:focus, .btn.active.focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.btn:hover, .btn:focus, .btn.focus { + color: #333; + text-decoration: none; +} +.btn:active, .btn.active { + outline: 0; + background-image: none; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} +.btn.disabled, .btn[disabled], fieldset[disabled] .btn { + cursor: not-allowed; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none; +} + +a.btn.disabled, fieldset[disabled] a.btn { + pointer-events: none; +} + +.btn-default { + color: #333; + background-color: #fff; + border-color: #ccc; +} +.btn-default:focus, .btn-default.focus { + color: #333; + background-color: #e6e6e6; + border-color: #8c8c8c; +} +.btn-default:hover { + color: #333; + background-color: #e6e6e6; + border-color: #adadad; +} +.btn-default:active, .btn-default.active, .open > .btn-default.dropdown-toggle { + color: #333; + background-color: #e6e6e6; + border-color: #adadad; +} +.btn-default:active:hover, .btn-default:active:focus, .btn-default:active.focus, .btn-default.active:hover, .btn-default.active:focus, .btn-default.active.focus, .open > .btn-default.dropdown-toggle:hover, .open > .btn-default.dropdown-toggle:focus, .open > .btn-default.dropdown-toggle.focus { + color: #333; + background-color: #d4d4d4; + border-color: #8c8c8c; +} +.btn-default:active, .btn-default.active, .open > .btn-default.dropdown-toggle { + background-image: none; +} +.btn-default.disabled, .btn-default.disabled:hover, .btn-default.disabled:focus, .btn-default.disabled.focus, .btn-default.disabled:active, .btn-default.disabled.active, .btn-default[disabled], .btn-default[disabled]:hover, .btn-default[disabled]:focus, .btn-default[disabled].focus, .btn-default[disabled]:active, .btn-default[disabled].active, fieldset[disabled] .btn-default, fieldset[disabled] .btn-default:hover, fieldset[disabled] .btn-default:focus, fieldset[disabled] .btn-default.focus, fieldset[disabled] .btn-default:active, fieldset[disabled] .btn-default.active { + background-color: #fff; + border-color: #ccc; +} +.btn-default .badge { + color: #fff; + background-color: #333; +} + +.btn-primary { + color: #fff; + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary:focus, .btn-primary.focus { + color: #fff; + background-color: #286090; + border-color: #122b40; +} +.btn-primary:hover { + color: #fff; + background-color: #286090; + border-color: #204d74; +} +.btn-primary:active, .btn-primary.active, .open > .btn-primary.dropdown-toggle { + color: #fff; + background-color: #286090; + border-color: #204d74; +} +.btn-primary:active:hover, .btn-primary:active:focus, .btn-primary:active.focus, .btn-primary.active:hover, .btn-primary.active:focus, .btn-primary.active.focus, .open > .btn-primary.dropdown-toggle:hover, .open > .btn-primary.dropdown-toggle:focus, .open > .btn-primary.dropdown-toggle.focus { + color: #fff; + background-color: #204d74; + border-color: #122b40; +} +.btn-primary:active, .btn-primary.active, .open > .btn-primary.dropdown-toggle { + background-image: none; +} +.btn-primary.disabled, .btn-primary.disabled:hover, .btn-primary.disabled:focus, .btn-primary.disabled.focus, .btn-primary.disabled:active, .btn-primary.disabled.active, .btn-primary[disabled], .btn-primary[disabled]:hover, .btn-primary[disabled]:focus, .btn-primary[disabled].focus, .btn-primary[disabled]:active, .btn-primary[disabled].active, fieldset[disabled] .btn-primary, fieldset[disabled] .btn-primary:hover, fieldset[disabled] .btn-primary:focus, fieldset[disabled] .btn-primary.focus, fieldset[disabled] .btn-primary:active, fieldset[disabled] .btn-primary.active { + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary .badge { + color: #337ab7; + background-color: #fff; +} + +.btn-success { + color: #fff; + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success:focus, .btn-success.focus { + color: #fff; + background-color: #449d44; + border-color: #255625; +} +.btn-success:hover { + color: #fff; + background-color: #449d44; + border-color: #398439; +} +.btn-success:active, .btn-success.active, .open > .btn-success.dropdown-toggle { + color: #fff; + background-color: #449d44; + border-color: #398439; +} +.btn-success:active:hover, .btn-success:active:focus, .btn-success:active.focus, .btn-success.active:hover, .btn-success.active:focus, .btn-success.active.focus, .open > .btn-success.dropdown-toggle:hover, .open > .btn-success.dropdown-toggle:focus, .open > .btn-success.dropdown-toggle.focus { + color: #fff; + background-color: #398439; + border-color: #255625; +} +.btn-success:active, .btn-success.active, .open > .btn-success.dropdown-toggle { + background-image: none; +} +.btn-success.disabled, .btn-success.disabled:hover, .btn-success.disabled:focus, .btn-success.disabled.focus, .btn-success.disabled:active, .btn-success.disabled.active, .btn-success[disabled], .btn-success[disabled]:hover, .btn-success[disabled]:focus, .btn-success[disabled].focus, .btn-success[disabled]:active, .btn-success[disabled].active, fieldset[disabled] .btn-success, fieldset[disabled] .btn-success:hover, fieldset[disabled] .btn-success:focus, fieldset[disabled] .btn-success.focus, fieldset[disabled] .btn-success:active, fieldset[disabled] .btn-success.active { + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success .badge { + color: #5cb85c; + background-color: #fff; +} + +.btn-info { + color: #fff; + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info:focus, .btn-info.focus { + color: #fff; + background-color: #31b0d5; + border-color: #1b6d85; +} +.btn-info:hover { + color: #fff; + background-color: #31b0d5; + border-color: #269abc; +} +.btn-info:active, .btn-info.active, .open > .btn-info.dropdown-toggle { + color: #fff; + background-color: #31b0d5; + border-color: #269abc; +} +.btn-info:active:hover, .btn-info:active:focus, .btn-info:active.focus, .btn-info.active:hover, .btn-info.active:focus, .btn-info.active.focus, .open > .btn-info.dropdown-toggle:hover, .open > .btn-info.dropdown-toggle:focus, .open > .btn-info.dropdown-toggle.focus { + color: #fff; + background-color: #269abc; + border-color: #1b6d85; +} +.btn-info:active, .btn-info.active, .open > .btn-info.dropdown-toggle { + background-image: none; +} +.btn-info.disabled, .btn-info.disabled:hover, .btn-info.disabled:focus, .btn-info.disabled.focus, .btn-info.disabled:active, .btn-info.disabled.active, .btn-info[disabled], .btn-info[disabled]:hover, .btn-info[disabled]:focus, .btn-info[disabled].focus, .btn-info[disabled]:active, .btn-info[disabled].active, fieldset[disabled] .btn-info, fieldset[disabled] .btn-info:hover, fieldset[disabled] .btn-info:focus, fieldset[disabled] .btn-info.focus, fieldset[disabled] .btn-info:active, fieldset[disabled] .btn-info.active { + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info .badge { + color: #5bc0de; + background-color: #fff; +} + +.btn-warning { + color: #fff; + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning:focus, .btn-warning.focus { + color: #fff; + background-color: #ec971f; + border-color: #985f0d; +} +.btn-warning:hover { + color: #fff; + background-color: #ec971f; + border-color: #d58512; +} +.btn-warning:active, .btn-warning.active, .open > .btn-warning.dropdown-toggle { + color: #fff; + background-color: #ec971f; + border-color: #d58512; +} +.btn-warning:active:hover, .btn-warning:active:focus, .btn-warning:active.focus, .btn-warning.active:hover, .btn-warning.active:focus, .btn-warning.active.focus, .open > .btn-warning.dropdown-toggle:hover, .open > .btn-warning.dropdown-toggle:focus, .open > .btn-warning.dropdown-toggle.focus { + color: #fff; + background-color: #d58512; + border-color: #985f0d; +} +.btn-warning:active, .btn-warning.active, .open > .btn-warning.dropdown-toggle { + background-image: none; +} +.btn-warning.disabled, .btn-warning.disabled:hover, .btn-warning.disabled:focus, .btn-warning.disabled.focus, .btn-warning.disabled:active, .btn-warning.disabled.active, .btn-warning[disabled], .btn-warning[disabled]:hover, .btn-warning[disabled]:focus, .btn-warning[disabled].focus, .btn-warning[disabled]:active, .btn-warning[disabled].active, fieldset[disabled] .btn-warning, fieldset[disabled] .btn-warning:hover, fieldset[disabled] .btn-warning:focus, fieldset[disabled] .btn-warning.focus, fieldset[disabled] .btn-warning:active, fieldset[disabled] .btn-warning.active { + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning .badge { + color: #f0ad4e; + background-color: #fff; +} + +.btn-danger { + color: #fff; + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger:focus, .btn-danger.focus { + color: #fff; + background-color: #c9302c; + border-color: #761c19; +} +.btn-danger:hover { + color: #fff; + background-color: #c9302c; + border-color: #ac2925; +} +.btn-danger:active, .btn-danger.active, .open > .btn-danger.dropdown-toggle { + color: #fff; + background-color: #c9302c; + border-color: #ac2925; +} +.btn-danger:active:hover, .btn-danger:active:focus, .btn-danger:active.focus, .btn-danger.active:hover, .btn-danger.active:focus, .btn-danger.active.focus, .open > .btn-danger.dropdown-toggle:hover, .open > .btn-danger.dropdown-toggle:focus, .open > .btn-danger.dropdown-toggle.focus { + color: #fff; + background-color: #ac2925; + border-color: #761c19; +} +.btn-danger:active, .btn-danger.active, .open > .btn-danger.dropdown-toggle { + background-image: none; +} +.btn-danger.disabled, .btn-danger.disabled:hover, .btn-danger.disabled:focus, .btn-danger.disabled.focus, .btn-danger.disabled:active, .btn-danger.disabled.active, .btn-danger[disabled], .btn-danger[disabled]:hover, .btn-danger[disabled]:focus, .btn-danger[disabled].focus, .btn-danger[disabled]:active, .btn-danger[disabled].active, fieldset[disabled] .btn-danger, fieldset[disabled] .btn-danger:hover, fieldset[disabled] .btn-danger:focus, fieldset[disabled] .btn-danger.focus, fieldset[disabled] .btn-danger:active, fieldset[disabled] .btn-danger.active { + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger .badge { + color: #d9534f; + background-color: #fff; +} + +.btn-link { + color: #08c; + font-weight: normal; + border-radius: 0; +} +.btn-link, .btn-link:active, .btn-link.active, .btn-link[disabled], fieldset[disabled] .btn-link { + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-link, .btn-link:hover, .btn-link:focus, .btn-link:active { + border-color: transparent; +} +.btn-link:hover, .btn-link:focus { + color: #1ab3ff; + text-decoration: underline; + background-color: transparent; +} +.btn-link[disabled]:hover, .btn-link[disabled]:focus, fieldset[disabled] .btn-link:hover, fieldset[disabled] .btn-link:focus { + color: #777777; + text-decoration: none; +} + +.btn-lg, .btn-group-lg > .btn { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} + +.btn-sm, .btn-group-sm > .btn { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} + +.btn-xs, .btn-group-xs > .btn { + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} + +.btn-block { + display: block; + width: 100%; +} + +.btn-block + .btn-block { + margin-top: 5px; +} + +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} + +.fade { + opacity: 0; + -webkit-transition: opacity 0.15s linear; + -o-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; +} +.fade.in { + opacity: 1; +} + +.collapse { + display: none; +} +.collapse.in { + display: block; +} + +tr.collapse.in { + display: table-row; +} + +tbody.collapse.in { + display: table-row-group; +} + +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition-property: height, visibility; + transition-property: height, visibility; + -webkit-transition-duration: 0.35s; + transition-duration: 0.35s; + -webkit-transition-timing-function: ease; + transition-timing-function: ease; +} + +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px dashed; + border-top: 4px solid \9; + border-right: 4px solid transparent; + border-left: 4px solid transparent; +} + +.dropup, +.dropdown { + position: relative; +} + +.dropdown-toggle:focus { + outline: 0; +} + +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + list-style: none; + font-size: 14px; + text-align: left; + background-color: #fff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 4px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + background-clip: padding-box; +} +.dropdown-menu.pull-right { + right: 0; + left: auto; +} +.dropdown-menu .divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.42857143; + color: #333333; + white-space: nowrap; +} + +.dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus { + text-decoration: none; + color: #262626; + background-color: #f5f5f5; +} + +.dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus { + color: #fff; + text-decoration: none; + outline: 0; + background-color: #337ab7; +} + +.dropdown-menu > .disabled > a, .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { + color: #777777; +} +.dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { + text-decoration: none; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + cursor: not-allowed; +} + +.open > .dropdown-menu { + display: block; +} +.open > a { + outline: 0; +} + +.dropdown-menu-right { + left: auto; + right: 0; +} + +.dropdown-menu-left { + left: 0; + right: auto; +} + +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: 12px; + line-height: 1.42857143; + color: #777777; + white-space: nowrap; +} + +.dropdown-backdrop { + position: fixed; + left: 0; + right: 0; + bottom: 0; + top: 0; + z-index: 990; +} + +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} + +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + border-top: 0; + border-bottom: 4px dashed; + border-bottom: 4px solid \9; + content: ""; +} +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 2px; +} + +@media (min-width: 768px) { + .navbar-right .dropdown-menu { + right: 0; + left: auto; + } + .navbar-right .dropdown-menu-left { + left: 0; + right: auto; + } +} +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle; +} +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + float: left; +} +.btn-group > .btn:hover, .btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active, +.btn-group-vertical > .btn:hover, +.btn-group-vertical > .btn:focus, +.btn-group-vertical > .btn:active, +.btn-group-vertical > .btn.active { + z-index: 2; +} + +.btn-group .btn + .btn, +.btn-group .btn + .btn-group, +.btn-group .btn-group + .btn, +.btn-group .btn-group + .btn-group { + margin-left: -1px; +} + +.btn-toolbar { + margin-left: -5px; +} +.btn-toolbar:before, .btn-toolbar:after { + content: " "; + display: table; +} +.btn-toolbar:after { + clear: both; +} +.btn-toolbar .btn, +.btn-toolbar .btn-group, +.btn-toolbar .input-group { + float: left; +} +.btn-toolbar > .btn, +.btn-toolbar > .btn-group, +.btn-toolbar > .input-group { + margin-left: 5px; +} + +.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0; +} + +.btn-group > .btn:first-child { + margin-left: 0; +} +.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} + +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} + +.btn-group > .btn-group { + float: left; +} + +.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} + +.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} + +.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} + +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} + +.btn-group > .btn + .dropdown-toggle { + padding-left: 8px; + padding-right: 8px; +} + +.btn-group > .btn-lg + .dropdown-toggle, .btn-group-lg.btn-group > .btn + .dropdown-toggle { + padding-left: 12px; + padding-right: 12px; +} + +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} +.btn-group.open .dropdown-toggle.btn-link { + -webkit-box-shadow: none; + box-shadow: none; +} + +.btn .caret { + margin-left: 0; +} + +.btn-lg .caret, .btn-group-lg > .btn .caret { + border-width: 5px 5px 0; + border-bottom-width: 0; +} + +.dropup .btn-lg .caret, .dropup .btn-group-lg > .btn .caret { + border-width: 0 5px 5px; +} + +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group, +.btn-group-vertical > .btn-group > .btn { + display: block; + float: none; + width: 100%; + max-width: 100%; +} +.btn-group-vertical > .btn-group:before, .btn-group-vertical > .btn-group:after { + content: " "; + display: table; +} +.btn-group-vertical > .btn-group:after { + clear: both; +} +.btn-group-vertical > .btn-group > .btn { + float: none; +} +.btn-group-vertical > .btn + .btn, +.btn-group-vertical > .btn + .btn-group, +.btn-group-vertical > .btn-group + .btn, +.btn-group-vertical > .btn-group + .btn-group { + margin-top: -1px; + margin-left: 0; +} + +.btn-group-vertical > .btn:not(:first-child):not(:last-child) { + border-radius: 0; +} +.btn-group-vertical > .btn:first-child:not(:last-child) { + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn:last-child:not(:first-child) { + border-bottom-left-radius: 4px; + border-top-right-radius: 0; + border-top-left-radius: 0; +} + +.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} + +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} + +.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-right-radius: 0; + border-top-left-radius: 0; +} + +.btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; +} +.btn-group-justified > .btn, +.btn-group-justified > .btn-group { + float: none; + display: table-cell; + width: 1%; +} +.btn-group-justified > .btn-group .btn { + width: 100%; +} +.btn-group-justified > .btn-group .dropdown-menu { + left: auto; +} + +[data-toggle="buttons"] > .btn input[type="radio"], +[data-toggle="buttons"] > .btn input[type="checkbox"], +[data-toggle="buttons"] > .btn-group > .btn input[type="radio"], +[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} + +.input-group { + position: relative; + display: table; + border-collapse: separate; +} +.input-group[class*="col-"] { + float: none; + padding-left: 0; + padding-right: 0; +} +.input-group .form-control { + position: relative; + z-index: 2; + float: left; + width: 100%; + margin-bottom: 0; +} + +.input-group-addon, +.input-group-btn, +.input-group .form-control { + display: table-cell; +} +.input-group-addon:not(:first-child):not(:last-child), +.input-group-btn:not(:first-child):not(:last-child), +.input-group .form-control:not(:first-child):not(:last-child) { + border-radius: 0; +} + +.input-group-addon, +.input-group-btn { + width: 1%; + white-space: nowrap; + vertical-align: middle; +} + +.input-group-addon { + padding: 6px 12px; + font-size: 14px; + font-weight: normal; + line-height: 1; + color: #555555; + text-align: center; + background-color: #eeeeee; + border: 1px solid #ccc; + border-radius: 4px; +} +.input-group-addon.input-sm, +.input-group-sm > .input-group-addon, +.input-group-sm > .input-group-btn > .input-group-addon.btn { + padding: 5px 10px; + font-size: 12px; + border-radius: 3px; +} +.input-group-addon.input-lg, +.input-group-lg > .input-group-addon, +.input-group-lg > .input-group-btn > .input-group-addon.btn { + padding: 10px 16px; + font-size: 18px; + border-radius: 6px; +} +.input-group-addon input[type="radio"], +.input-group-addon input[type="checkbox"] { + margin-top: 0; +} + +.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group > .btn, +.input-group-btn:first-child > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} + +.input-group-addon:first-child { + border-right: 0; +} + +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group > .btn, +.input-group-btn:last-child > .dropdown-toggle, +.input-group-btn:first-child > .btn:not(:first-child), +.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} + +.input-group-addon:last-child { + border-left: 0; +} + +.input-group-btn { + position: relative; + font-size: 0; + white-space: nowrap; +} +.input-group-btn > .btn { + position: relative; +} +.input-group-btn > .btn + .btn { + margin-left: -1px; +} +.input-group-btn > .btn:hover, .input-group-btn > .btn:focus, .input-group-btn > .btn:active { + z-index: 2; +} +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group { + margin-right: -1px; +} +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group { + z-index: 2; + margin-left: -1px; +} + +.nav { + margin-bottom: 0; + padding-left: 0; + list-style: none; +} +.nav:before, .nav:after { + content: " "; + display: table; +} +.nav:after { + clear: both; +} +.nav > li { + position: relative; + display: block; +} +.nav > li > a { + position: relative; + display: block; + padding: 10px 15px; +} +.nav > li > a:hover, .nav > li > a:focus { + text-decoration: none; + background-color: #eeeeee; +} +.nav > li.disabled > a { + color: #777777; +} +.nav > li.disabled > a:hover, .nav > li.disabled > a:focus { + color: #777777; + text-decoration: none; + background-color: transparent; + cursor: not-allowed; +} +.nav .open > a, .nav .open > a:hover, .nav .open > a:focus { + background-color: #eeeeee; + border-color: #08c; +} +.nav .nav-divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.nav > li > a > img { + max-width: none; +} + +.nav-tabs { + border-bottom: 1px solid #ddd; +} +.nav-tabs > li { + float: left; + margin-bottom: -1px; +} +.nav-tabs > li > a { + margin-right: 2px; + line-height: 1.42857143; + border: 1px solid transparent; + border-radius: 4px 4px 0 0; +} +.nav-tabs > li > a:hover { + border-color: #eeeeee #eeeeee #ddd; +} +.nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus { + color: #555555; + background-color: #2f2f2f; + border: 1px solid #ddd; + border-bottom-color: transparent; + cursor: default; +} + +.nav-pills > li { + float: left; +} +.nav-pills > li > a { + border-radius: 4px; +} +.nav-pills > li + li { + margin-left: 2px; +} +.nav-pills > li.active > a, .nav-pills > li.active > a:hover, .nav-pills > li.active > a:focus { + color: #fff; + background-color: #337ab7; +} + +.nav-stacked > li { + float: none; +} +.nav-stacked > li + li { + margin-top: 2px; + margin-left: 0; +} + +.nav-justified, .nav-tabs.nav-justified { + width: 100%; +} +.nav-justified > li, .nav-tabs.nav-justified > li { + float: none; +} +.nav-justified > li > a, .nav-tabs.nav-justified > li > a { + text-align: center; + margin-bottom: 5px; +} +.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-justified > li, .nav-tabs.nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-justified > li > a, .nav-tabs.nav-justified > li > a { + margin-bottom: 0; + } +} + +.nav-tabs-justified, .nav-tabs.nav-justified { + border-bottom: 0; +} +.nav-tabs-justified > li > a, .nav-tabs.nav-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs-justified > .active > a, .nav-tabs.nav-justified > .active > a, +.nav-tabs-justified > .active > a:hover, +.nav-tabs.nav-justified > .active > a:hover, +.nav-tabs-justified > .active > a:focus, +.nav-tabs.nav-justified > .active > a:focus { + border: 1px solid #ddd; +} +@media (min-width: 768px) { + .nav-tabs-justified > li > a, .nav-tabs.nav-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs-justified > .active > a, .nav-tabs.nav-justified > .active > a, + .nav-tabs-justified > .active > a:hover, + .nav-tabs.nav-justified > .active > a:hover, + .nav-tabs-justified > .active > a:focus, + .nav-tabs.nav-justified > .active > a:focus { + border-bottom-color: #2f2f2f; + } +} + +.tab-content > .tab-pane { + display: none; +} +.tab-content > .active { + display: block; +} + +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-right-radius: 0; + border-top-left-radius: 0; +} + +.navbar { + position: relative; + min-height: 50px; + margin-bottom: 20px; + border: 1px solid transparent; +} +.navbar:before, .navbar:after { + content: " "; + display: table; +} +.navbar:after { + clear: both; +} +@media (min-width: 768px) { + .navbar { + border-radius: 4px; + } +} + +.navbar-header:before, .navbar-header:after { + content: " "; + display: table; +} +.navbar-header:after { + clear: both; +} +@media (min-width: 768px) { + .navbar-header { + float: left; + } +} + +.navbar-collapse { + overflow-x: visible; + padding-right: 15px; + padding-left: 15px; + border-top: 1px solid transparent; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); + -webkit-overflow-scrolling: touch; +} +.navbar-collapse:before, .navbar-collapse:after { + content: " "; + display: table; +} +.navbar-collapse:after { + clear: both; +} +.navbar-collapse.in { + overflow-y: auto; +} +@media (min-width: 768px) { + .navbar-collapse { + width: auto; + border-top: 0; + box-shadow: none; + } + .navbar-collapse.collapse { + display: block !important; + height: auto !important; + padding-bottom: 0; + overflow: visible !important; + } + .navbar-collapse.in { + overflow-y: visible; + } + .navbar-fixed-top .navbar-collapse, .navbar-static-top .navbar-collapse, .navbar-fixed-bottom .navbar-collapse { + padding-left: 0; + padding-right: 0; + } +} + +.navbar-fixed-top .navbar-collapse, +.navbar-fixed-bottom .navbar-collapse { + max-height: 340px; +} +@media (max-device-width: 480px) and (orientation: landscape) { + .navbar-fixed-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + max-height: 200px; + } +} + +.container > .navbar-header, +.container > .navbar-collapse, +.container-fluid > .navbar-header, +.container-fluid > .navbar-collapse { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .container > .navbar-header, + .container > .navbar-collapse, + .container-fluid > .navbar-header, + .container-fluid > .navbar-collapse { + margin-right: 0; + margin-left: 0; + } +} + +.navbar-static-top { + z-index: 1000; + border-width: 0 0 1px; +} +@media (min-width: 768px) { + .navbar-static-top { + border-radius: 0; + } +} + +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; +} +@media (min-width: 768px) { + .navbar-fixed-top, + .navbar-fixed-bottom { + border-radius: 0; + } +} + +.navbar-fixed-top { + top: 0; + border-width: 0 0 1px; +} + +.navbar-fixed-bottom { + bottom: 0; + margin-bottom: 0; + border-width: 1px 0 0; +} + +.navbar-brand { + float: left; + padding: 15px 15px; + font-size: 18px; + line-height: 20px; + height: 50px; +} +.navbar-brand:hover, .navbar-brand:focus { + text-decoration: none; +} +.navbar-brand > img { + display: block; +} +@media (min-width: 768px) { + .navbar > .container .navbar-brand, .navbar > .container-fluid .navbar-brand { + margin-left: -15px; + } +} + +.navbar-toggle { + position: relative; + float: right; + margin-right: 15px; + padding: 9px 10px; + margin-top: 8px; + margin-bottom: 8px; + background-color: transparent; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} +.navbar-toggle:focus { + outline: 0; +} +.navbar-toggle .icon-bar { + display: block; + width: 22px; + height: 2px; + border-radius: 1px; +} +.navbar-toggle .icon-bar + .icon-bar { + margin-top: 4px; +} +@media (min-width: 768px) { + .navbar-toggle { + display: none; + } +} + +.navbar-nav { + margin: 7.5px -15px; +} +.navbar-nav > li > a { + padding-top: 10px; + padding-bottom: 10px; + line-height: 20px; +} +@media (max-width: 767px) { + .navbar-nav .open .dropdown-menu { + position: static; + float: none; + width: auto; + margin-top: 0; + background-color: transparent; + border: 0; + box-shadow: none; + } + .navbar-nav .open .dropdown-menu > li > a, + .navbar-nav .open .dropdown-menu .dropdown-header { + padding: 5px 15px 5px 25px; + } + .navbar-nav .open .dropdown-menu > li > a { + line-height: 20px; + } + .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-nav .open .dropdown-menu > li > a:focus { + background-image: none; + } +} +@media (min-width: 768px) { + .navbar-nav { + float: left; + margin: 0; + } + .navbar-nav > li { + float: left; + } + .navbar-nav > li > a { + padding-top: 15px; + padding-bottom: 15px; + } +} + +.navbar-form { + margin-left: -15px; + margin-right: -15px; + padding: 10px 15px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + margin-top: 8px; + margin-bottom: 8px; +} +@media (min-width: 768px) { + .navbar-form .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .navbar-form .form-control-static { + display: inline-block; + } + .navbar-form .input-group { + display: inline-table; + vertical-align: middle; + } + .navbar-form .input-group .input-group-addon, + .navbar-form .input-group .input-group-btn, + .navbar-form .input-group .form-control { + width: auto; + } + .navbar-form .input-group > .form-control { + width: 100%; + } + .navbar-form .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio, + .navbar-form .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio label, + .navbar-form .checkbox label { + padding-left: 0; + } + .navbar-form .radio input[type="radio"], + .navbar-form .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .navbar-form .has-feedback .form-control-feedback { + top: 0; + } +} +@media (max-width: 767px) { + .navbar-form .form-group { + margin-bottom: 5px; + } + .navbar-form .form-group:last-child { + margin-bottom: 0; + } +} +@media (min-width: 768px) { + .navbar-form { + width: auto; + border: 0; + margin-left: 0; + margin-right: 0; + padding-top: 0; + padding-bottom: 0; + -webkit-box-shadow: none; + box-shadow: none; + } +} + +.navbar-nav > li > .dropdown-menu { + margin-top: 0; + border-top-right-radius: 0; + border-top-left-radius: 0; +} + +.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + margin-bottom: 0; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} + +.navbar-btn { + margin-top: 8px; + margin-bottom: 8px; +} +.navbar-btn.btn-sm, .btn-group-sm > .navbar-btn.btn { + margin-top: 10px; + margin-bottom: 10px; +} +.navbar-btn.btn-xs, .btn-group-xs > .navbar-btn.btn { + margin-top: 14px; + margin-bottom: 14px; +} + +.navbar-text { + margin-top: 15px; + margin-bottom: 15px; +} +@media (min-width: 768px) { + .navbar-text { + float: left; + margin-left: 15px; + margin-right: 15px; + } +} + +@media (min-width: 768px) { + .navbar-left { + float: left !important; + } + + .navbar-right { + float: right !important; + margin-right: -15px; + } + .navbar-right ~ .navbar-right { + margin-right: 0; + } +} +.navbar-default { + background-color: #f8f8f8; + border-color: #e7e7e7; +} +.navbar-default .navbar-brand { + color: #777; +} +.navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus { + color: #5e5e5e; + background-color: transparent; +} +.navbar-default .navbar-text { + color: #777; +} +.navbar-default .navbar-nav > li > a { + color: #777; +} +.navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus { + color: #333; + background-color: transparent; +} +.navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:focus { + color: #555; + background-color: #e7e7e7; +} +.navbar-default .navbar-nav > .disabled > a, .navbar-default .navbar-nav > .disabled > a:hover, .navbar-default .navbar-nav > .disabled > a:focus { + color: #ccc; + background-color: transparent; +} +.navbar-default .navbar-toggle { + border-color: #ddd; +} +.navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus { + background-color: #ddd; +} +.navbar-default .navbar-toggle .icon-bar { + background-color: #888; +} +.navbar-default .navbar-collapse, +.navbar-default .navbar-form { + border-color: #e7e7e7; +} +.navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus { + background-color: #e7e7e7; + color: #555; +} +@media (max-width: 767px) { + .navbar-default .navbar-nav .open .dropdown-menu > li > a { + color: #777; + } + .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { + color: #333; + background-color: transparent; + } + .navbar-default .navbar-nav .open .dropdown-menu > .active > a, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #555; + background-color: #e7e7e7; + } + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #ccc; + background-color: transparent; + } +} +.navbar-default .navbar-link { + color: #777; +} +.navbar-default .navbar-link:hover { + color: #333; +} +.navbar-default .btn-link { + color: #777; +} +.navbar-default .btn-link:hover, .navbar-default .btn-link:focus { + color: #333; +} +.navbar-default .btn-link[disabled]:hover, .navbar-default .btn-link[disabled]:focus, fieldset[disabled] .navbar-default .btn-link:hover, fieldset[disabled] .navbar-default .btn-link:focus { + color: #ccc; +} + +.navbar-inverse { + background-color: #222; + border-color: #090909; +} +.navbar-inverse .navbar-brand { + color: #9d9d9d; +} +.navbar-inverse .navbar-brand:hover, .navbar-inverse .navbar-brand:focus { + color: #fff; + background-color: transparent; +} +.navbar-inverse .navbar-text { + color: #9d9d9d; +} +.navbar-inverse .navbar-nav > li > a { + color: #9d9d9d; +} +.navbar-inverse .navbar-nav > li > a:hover, .navbar-inverse .navbar-nav > li > a:focus { + color: #fff; + background-color: transparent; +} +.navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus { + color: #fff; + background-color: #090909; +} +.navbar-inverse .navbar-nav > .disabled > a, .navbar-inverse .navbar-nav > .disabled > a:hover, .navbar-inverse .navbar-nav > .disabled > a:focus { + color: #444; + background-color: transparent; +} +.navbar-inverse .navbar-toggle { + border-color: #333; +} +.navbar-inverse .navbar-toggle:hover, .navbar-inverse .navbar-toggle:focus { + background-color: #333; +} +.navbar-inverse .navbar-toggle .icon-bar { + background-color: #fff; +} +.navbar-inverse .navbar-collapse, +.navbar-inverse .navbar-form { + border-color: #101010; +} +.navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus { + background-color: #090909; + color: #fff; +} +@media (max-width: 767px) { + .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { + border-color: #090909; + } + .navbar-inverse .navbar-nav .open .dropdown-menu .divider { + background-color: #090909; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { + color: #9d9d9d; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { + color: #fff; + background-color: transparent; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #fff; + background-color: #090909; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #444; + background-color: transparent; + } +} +.navbar-inverse .navbar-link { + color: #9d9d9d; +} +.navbar-inverse .navbar-link:hover { + color: #fff; +} +.navbar-inverse .btn-link { + color: #9d9d9d; +} +.navbar-inverse .btn-link:hover, .navbar-inverse .btn-link:focus { + color: #fff; +} +.navbar-inverse .btn-link[disabled]:hover, .navbar-inverse .btn-link[disabled]:focus, fieldset[disabled] .navbar-inverse .btn-link:hover, fieldset[disabled] .navbar-inverse .btn-link:focus { + color: #444; +} + +.breadcrumb { + padding: 8px 15px; + margin-bottom: 20px; + list-style: none; + background-color: #f5f5f5; + border-radius: 4px; +} +.breadcrumb > li { + display: inline-block; +} +.breadcrumb > li + li:before { + content: "/ "; + padding: 0 5px; + color: #ccc; +} +.breadcrumb > .active { + color: #777777; +} + +.pagination { + display: inline-block; + padding-left: 0; + margin: 20px 0; + border-radius: 4px; +} +.pagination > li { + display: inline; +} +.pagination > li > a, +.pagination > li > span { + position: relative; + float: left; + padding: 6px 12px; + line-height: 1.42857143; + text-decoration: none; + color: #08c; + background-color: #fff; + border: 1px solid #ddd; + margin-left: -1px; +} +.pagination > li:first-child > a, +.pagination > li:first-child > span { + margin-left: 0; + border-bottom-left-radius: 4px; + border-top-left-radius: 4px; +} +.pagination > li:last-child > a, +.pagination > li:last-child > span { + border-bottom-right-radius: 4px; + border-top-right-radius: 4px; +} +.pagination > li > a:hover, .pagination > li > a:focus, +.pagination > li > span:hover, +.pagination > li > span:focus { + z-index: 3; + color: #1ab3ff; + background-color: #eeeeee; + border-color: #ddd; +} +.pagination > .active > a, .pagination > .active > a:hover, .pagination > .active > a:focus, +.pagination > .active > span, +.pagination > .active > span:hover, +.pagination > .active > span:focus { + z-index: 2; + color: #fff; + background-color: #337ab7; + border-color: #337ab7; + cursor: default; +} +.pagination > .disabled > span, +.pagination > .disabled > span:hover, +.pagination > .disabled > span:focus, +.pagination > .disabled > a, +.pagination > .disabled > a:hover, +.pagination > .disabled > a:focus { + color: #777777; + background-color: #fff; + border-color: #ddd; + cursor: not-allowed; +} + +.pagination-lg > li > a, +.pagination-lg > li > span { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; +} +.pagination-lg > li:first-child > a, +.pagination-lg > li:first-child > span { + border-bottom-left-radius: 6px; + border-top-left-radius: 6px; +} +.pagination-lg > li:last-child > a, +.pagination-lg > li:last-child > span { + border-bottom-right-radius: 6px; + border-top-right-radius: 6px; +} + +.pagination-sm > li > a, +.pagination-sm > li > span { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; +} +.pagination-sm > li:first-child > a, +.pagination-sm > li:first-child > span { + border-bottom-left-radius: 3px; + border-top-left-radius: 3px; +} +.pagination-sm > li:last-child > a, +.pagination-sm > li:last-child > span { + border-bottom-right-radius: 3px; + border-top-right-radius: 3px; +} + +.pager { + padding-left: 0; + margin: 20px 0; + list-style: none; + text-align: center; +} +.pager:before, .pager:after { + content: " "; + display: table; +} +.pager:after { + clear: both; +} +.pager li { + display: inline; +} +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 15px; +} +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: #eeeeee; +} +.pager .next > a, +.pager .next > span { + float: right; +} +.pager .previous > a, +.pager .previous > span { + float: left; +} +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #777777; + background-color: #fff; + cursor: not-allowed; +} + +.label { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; +} +.label:empty { + display: none; +} +.btn .label { + position: relative; + top: -1px; +} + +a.label:hover, a.label:focus { + color: #fff; + text-decoration: none; + cursor: pointer; +} + +.label-default { + background-color: #777777; +} +.label-default[href]:hover, .label-default[href]:focus { + background-color: #5e5e5e; +} + +.label-primary { + background-color: #337ab7; +} +.label-primary[href]:hover, .label-primary[href]:focus { + background-color: #286090; +} + +.label-success { + background-color: #5cb85c; +} +.label-success[href]:hover, .label-success[href]:focus { + background-color: #449d44; +} + +.label-info { + background-color: #5bc0de; +} +.label-info[href]:hover, .label-info[href]:focus { + background-color: #31b0d5; +} + +.label-warning { + background-color: #f0ad4e; +} +.label-warning[href]:hover, .label-warning[href]:focus { + background-color: #ec971f; +} + +.label-danger { + background-color: #d9534f; +} +.label-danger[href]:hover, .label-danger[href]:focus { + background-color: #c9302c; +} + +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: 12px; + font-weight: bold; + color: #fff; + line-height: 1; + vertical-align: middle; + white-space: nowrap; + text-align: center; + background-color: #777777; + border-radius: 10px; +} +.badge:empty { + display: none; +} +.btn .badge { + position: relative; + top: -1px; +} +.btn-xs .badge, .btn-group-xs > .btn .badge, .btn-group-xs > .btn .badge { + top: 0; + padding: 1px 5px; +} +.list-group-item.active > .badge, .nav-pills > .active > a > .badge { + color: #08c; + background-color: #fff; +} +.list-group-item > .badge { + float: right; +} +.list-group-item > .badge + .badge { + margin-right: 5px; +} +.nav-pills > li > a > .badge { + margin-left: 3px; +} + +a.badge:hover, a.badge:focus { + color: #fff; + text-decoration: none; + cursor: pointer; +} + +.jumbotron { + padding-top: 30px; + padding-bottom: 30px; + margin-bottom: 30px; + color: inherit; + background-color: #eeeeee; +} +.jumbotron h1, +.jumbotron .h1 { + color: inherit; +} +.jumbotron p { + margin-bottom: 15px; + font-size: 21px; + font-weight: 200; +} +.jumbotron > hr { + border-top-color: #d5d5d5; +} +.container .jumbotron, .container-fluid .jumbotron { + border-radius: 6px; +} +.jumbotron .container { + max-width: 100%; +} +@media screen and (min-width: 768px) { + .jumbotron { + padding-top: 48px; + padding-bottom: 48px; + } + .container .jumbotron, .container-fluid .jumbotron { + padding-left: 60px; + padding-right: 60px; + } + .jumbotron h1, + .jumbotron .h1 { + font-size: 63px; + } +} + +.thumbnail { + display: block; + padding: 4px; + margin-bottom: 20px; + line-height: 1.42857143; + background-color: #2f2f2f; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: border 0.2s ease-in-out; + -o-transition: border 0.2s ease-in-out; + transition: border 0.2s ease-in-out; +} +.thumbnail > img, +.thumbnail a > img { + display: block; + max-width: 100%; + height: auto; + margin-left: auto; + margin-right: auto; +} +.thumbnail .caption { + padding: 9px; + color: #c6c6c6; +} + +a.thumbnail:hover, +a.thumbnail:focus, +a.thumbnail.active { + border-color: #08c; +} + +.alert { + padding: 15px; + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: 4px; +} +.alert h4 { + margin-top: 0; + color: inherit; +} +.alert .alert-link { + font-weight: bold; +} +.alert > p, +.alert > ul { + margin-bottom: 0; +} +.alert > p + p { + margin-top: 5px; +} + +.alert-dismissable, +.alert-dismissible { + padding-right: 35px; +} +.alert-dismissable .close, +.alert-dismissible .close { + position: relative; + top: -2px; + right: -21px; + color: inherit; +} + +.alert-success { + background-color: #dff0d8; + border-color: #d6e9c6; + color: #3c763d; +} +.alert-success hr { + border-top-color: #c9e2b3; +} +.alert-success .alert-link { + color: #2b542c; +} + +.alert-info { + background-color: #d9edf7; + border-color: #bce8f1; + color: #31708f; +} +.alert-info hr { + border-top-color: #a6e1ec; +} +.alert-info .alert-link { + color: #245269; +} + +.alert-warning { + background-color: #fcf8e3; + border-color: #faebcc; + color: #8a6d3b; +} +.alert-warning hr { + border-top-color: #f7e1b5; +} +.alert-warning .alert-link { + color: #66512c; +} + +.alert-danger { + background-color: #f2dede; + border-color: #ebccd1; + color: #a94442; +} +.alert-danger hr { + border-top-color: #e4b9c0; +} +.alert-danger .alert-link { + color: #843534; +} + +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +.progress { + overflow: hidden; + height: 20px; + margin-bottom: 20px; + background-color: #f5f5f5; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); +} + +.progress-bar { + float: left; + width: 0%; + height: 100%; + font-size: 12px; + line-height: 20px; + color: #fff; + text-align: center; + background-color: #337ab7; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -webkit-transition: width 0.6s ease; + -o-transition: width 0.6s ease; + transition: width 0.6s ease; +} + +.progress-striped .progress-bar, +.progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, rgba(0, 0, 0, 0) 25%, rgba(0, 0, 0, 0) 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, rgba(0, 0, 0, 0) 75%, rgba(0, 0, 0, 0)); + background-size: 40px 40px; +} + +.progress.active .progress-bar, +.progress-bar.active { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} + +.progress-bar-success { + background-color: #5cb85c; +} +.progress-striped .progress-bar-success { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, rgba(0, 0, 0, 0) 25%, rgba(0, 0, 0, 0) 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, rgba(0, 0, 0, 0) 75%, rgba(0, 0, 0, 0)); +} + +.progress-bar-info { + background-color: #5bc0de; +} +.progress-striped .progress-bar-info { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, rgba(0, 0, 0, 0) 25%, rgba(0, 0, 0, 0) 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, rgba(0, 0, 0, 0) 75%, rgba(0, 0, 0, 0)); +} + +.progress-bar-warning { + background-color: #f0ad4e; +} +.progress-striped .progress-bar-warning { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, rgba(0, 0, 0, 0) 25%, rgba(0, 0, 0, 0) 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, rgba(0, 0, 0, 0) 75%, rgba(0, 0, 0, 0)); +} + +.progress-bar-danger { + background-color: #d9534f; +} +.progress-striped .progress-bar-danger { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, rgba(0, 0, 0, 0) 25%, rgba(0, 0, 0, 0) 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, rgba(0, 0, 0, 0) 75%, rgba(0, 0, 0, 0)); +} + +.media { + margin-top: 15px; +} +.media:first-child { + margin-top: 0; +} + +.media, +.media-body { + zoom: 1; + overflow: hidden; +} + +.media-body { + width: 10000px; +} + +.media-object { + display: block; +} +.media-object.img-thumbnail { + max-width: none; +} + +.media-right, +.media > .pull-right { + padding-left: 10px; +} + +.media-left, +.media > .pull-left { + padding-right: 10px; +} + +.media-left, +.media-right, +.media-body { + display: table-cell; + vertical-align: top; +} + +.media-middle { + vertical-align: middle; +} + +.media-bottom { + vertical-align: bottom; +} + +.media-heading { + margin-top: 0; + margin-bottom: 5px; +} + +.media-list { + padding-left: 0; + list-style: none; +} + +.list-group { + margin-bottom: 20px; + padding-left: 0; +} + +.list-group-item { + position: relative; + display: block; + padding: 10px 15px; + margin-bottom: -1px; + background-color: #fff; + border: 1px solid #ddd; +} +.list-group-item:first-child { + border-top-right-radius: 4px; + border-top-left-radius: 4px; +} +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} + +a.list-group-item, +button.list-group-item { + color: #555; +} +a.list-group-item .list-group-item-heading, +button.list-group-item .list-group-item-heading { + color: #333; +} +a.list-group-item:hover, a.list-group-item:focus, +button.list-group-item:hover, +button.list-group-item:focus { + text-decoration: none; + color: #555; + background-color: #f5f5f5; +} + +button.list-group-item { + width: 100%; + text-align: left; +} + +.list-group-item.disabled, .list-group-item.disabled:hover, .list-group-item.disabled:focus { + background-color: #eeeeee; + color: #777777; + cursor: not-allowed; +} +.list-group-item.disabled .list-group-item-heading, .list-group-item.disabled:hover .list-group-item-heading, .list-group-item.disabled:focus .list-group-item-heading { + color: inherit; +} +.list-group-item.disabled .list-group-item-text, .list-group-item.disabled:hover .list-group-item-text, .list-group-item.disabled:focus .list-group-item-text { + color: #777777; +} +.list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus { + z-index: 2; + color: #fff; + background-color: #337ab7; + border-color: #337ab7; +} +.list-group-item.active .list-group-item-heading, +.list-group-item.active .list-group-item-heading > small, +.list-group-item.active .list-group-item-heading > .small, .list-group-item.active:hover .list-group-item-heading, +.list-group-item.active:hover .list-group-item-heading > small, +.list-group-item.active:hover .list-group-item-heading > .small, .list-group-item.active:focus .list-group-item-heading, +.list-group-item.active:focus .list-group-item-heading > small, +.list-group-item.active:focus .list-group-item-heading > .small { + color: inherit; +} +.list-group-item.active .list-group-item-text, .list-group-item.active:hover .list-group-item-text, .list-group-item.active:focus .list-group-item-text { + color: #c7ddef; +} + +.list-group-item-success { + color: #3c763d; + background-color: #dff0d8; +} + +a.list-group-item-success, +button.list-group-item-success { + color: #3c763d; +} +a.list-group-item-success .list-group-item-heading, +button.list-group-item-success .list-group-item-heading { + color: inherit; +} +a.list-group-item-success:hover, a.list-group-item-success:focus, +button.list-group-item-success:hover, +button.list-group-item-success:focus { + color: #3c763d; + background-color: #d0e9c6; +} +a.list-group-item-success.active, a.list-group-item-success.active:hover, a.list-group-item-success.active:focus, +button.list-group-item-success.active, +button.list-group-item-success.active:hover, +button.list-group-item-success.active:focus { + color: #fff; + background-color: #3c763d; + border-color: #3c763d; +} + +.list-group-item-info { + color: #31708f; + background-color: #d9edf7; +} + +a.list-group-item-info, +button.list-group-item-info { + color: #31708f; +} +a.list-group-item-info .list-group-item-heading, +button.list-group-item-info .list-group-item-heading { + color: inherit; +} +a.list-group-item-info:hover, a.list-group-item-info:focus, +button.list-group-item-info:hover, +button.list-group-item-info:focus { + color: #31708f; + background-color: #c4e3f3; +} +a.list-group-item-info.active, a.list-group-item-info.active:hover, a.list-group-item-info.active:focus, +button.list-group-item-info.active, +button.list-group-item-info.active:hover, +button.list-group-item-info.active:focus { + color: #fff; + background-color: #31708f; + border-color: #31708f; +} + +.list-group-item-warning { + color: #8a6d3b; + background-color: #fcf8e3; +} + +a.list-group-item-warning, +button.list-group-item-warning { + color: #8a6d3b; +} +a.list-group-item-warning .list-group-item-heading, +button.list-group-item-warning .list-group-item-heading { + color: inherit; +} +a.list-group-item-warning:hover, a.list-group-item-warning:focus, +button.list-group-item-warning:hover, +button.list-group-item-warning:focus { + color: #8a6d3b; + background-color: #faf2cc; +} +a.list-group-item-warning.active, a.list-group-item-warning.active:hover, a.list-group-item-warning.active:focus, +button.list-group-item-warning.active, +button.list-group-item-warning.active:hover, +button.list-group-item-warning.active:focus { + color: #fff; + background-color: #8a6d3b; + border-color: #8a6d3b; +} + +.list-group-item-danger { + color: #a94442; + background-color: #f2dede; +} + +a.list-group-item-danger, +button.list-group-item-danger { + color: #a94442; +} +a.list-group-item-danger .list-group-item-heading, +button.list-group-item-danger .list-group-item-heading { + color: inherit; +} +a.list-group-item-danger:hover, a.list-group-item-danger:focus, +button.list-group-item-danger:hover, +button.list-group-item-danger:focus { + color: #a94442; + background-color: #ebcccc; +} +a.list-group-item-danger.active, a.list-group-item-danger.active:hover, a.list-group-item-danger.active:focus, +button.list-group-item-danger.active, +button.list-group-item-danger.active:hover, +button.list-group-item-danger.active:focus { + color: #fff; + background-color: #a94442; + border-color: #a94442; +} + +.list-group-item-heading { + margin-top: 0; + margin-bottom: 5px; +} + +.list-group-item-text { + margin-bottom: 0; + line-height: 1.3; +} + +.panel { + margin-bottom: 20px; + background-color: #fff; + border: 1px solid transparent; + border-radius: 4px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); +} + +.panel-body { + padding: 15px; +} +.panel-body:before, .panel-body:after { + content: " "; + display: table; +} +.panel-body:after { + clear: both; +} + +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-right-radius: 3px; + border-top-left-radius: 3px; +} +.panel-heading > .dropdown .dropdown-toggle { + color: inherit; +} + +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: 16px; + color: inherit; +} +.panel-title > a, +.panel-title > small, +.panel-title > .small, +.panel-title > small > a, +.panel-title > .small > a { + color: inherit; +} + +.panel-footer { + padding: 10px 15px; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} + +.panel > .list-group, +.panel > .panel-collapse > .list-group { + margin-bottom: 0; +} +.panel > .list-group .list-group-item, +.panel > .panel-collapse > .list-group .list-group-item { + border-width: 1px 0; + border-radius: 0; +} +.panel > .list-group:first-child .list-group-item:first-child, +.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { + border-top: 0; + border-top-right-radius: 3px; + border-top-left-radius: 3px; +} +.panel > .list-group:last-child .list-group-item:last-child, +.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { + border-bottom: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child { + border-top-right-radius: 0; + border-top-left-radius: 0; +} + +.panel-heading + .list-group .list-group-item:first-child { + border-top-width: 0; +} + +.list-group + .panel-footer { + border-top-width: 0; +} + +.panel > .table, +.panel > .table-responsive > .table, +.panel > .panel-collapse > .table { + margin-bottom: 0; +} +.panel > .table caption, +.panel > .table-responsive > .table caption, +.panel > .panel-collapse > .table caption { + padding-left: 15px; + padding-right: 15px; +} +.panel > .table:first-child, +.panel > .table-responsive:first-child > .table:first-child { + border-top-right-radius: 3px; + border-top-left-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { + border-top-left-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { + border-top-right-radius: 3px; +} +.panel > .table:last-child, +.panel > .table-responsive:last-child > .table:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { + border-bottom-left-radius: 3px; + border-bottom-right-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { + border-bottom-right-radius: 3px; +} +.panel > .panel-body + .table, +.panel > .panel-body + .table-responsive, +.panel > .table + .panel-body, +.panel > .table-responsive + .panel-body { + border-top: 1px solid #ddd; +} +.panel > .table > tbody:first-child > tr:first-child th, +.panel > .table > tbody:first-child > tr:first-child td { + border-top: 0; +} +.panel > .table-bordered, +.panel > .table-responsive > .table-bordered { + border: 0; +} +.panel > .table-bordered > thead > tr > th:first-child, +.panel > .table-bordered > thead > tr > td:first-child, +.panel > .table-bordered > tbody > tr > th:first-child, +.panel > .table-bordered > tbody > tr > td:first-child, +.panel > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-bordered > tfoot > tr > td:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; +} +.panel > .table-bordered > thead > tr > th:last-child, +.panel > .table-bordered > thead > tr > td:last-child, +.panel > .table-bordered > tbody > tr > th:last-child, +.panel > .table-bordered > tbody > tr > td:last-child, +.panel > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-bordered > tfoot > tr > td:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; +} +.panel > .table-bordered > thead > tr:first-child > td, +.panel > .table-bordered > thead > tr:first-child > th, +.panel > .table-bordered > tbody > tr:first-child > td, +.panel > .table-bordered > tbody > tr:first-child > th, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > td, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { + border-bottom: 0; +} +.panel > .table-bordered > tbody > tr:last-child > td, +.panel > .table-bordered > tbody > tr:last-child > th, +.panel > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-bordered > tfoot > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { + border-bottom: 0; +} +.panel > .table-responsive { + border: 0; + margin-bottom: 0; +} + +.panel-group { + margin-bottom: 20px; +} +.panel-group .panel { + margin-bottom: 0; + border-radius: 4px; +} +.panel-group .panel + .panel { + margin-top: 5px; +} +.panel-group .panel-heading { + border-bottom: 0; +} +.panel-group .panel-heading + .panel-collapse > .panel-body, +.panel-group .panel-heading + .panel-collapse > .list-group { + border-top: 1px solid #ddd; +} +.panel-group .panel-footer { + border-top: 0; +} +.panel-group .panel-footer + .panel-collapse .panel-body { + border-bottom: 1px solid #ddd; +} + +.panel-default { + border-color: #ddd; +} +.panel-default > .panel-heading { + color: #333333; + background-color: #f5f5f5; + border-color: #ddd; +} +.panel-default > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ddd; +} +.panel-default > .panel-heading .badge { + color: #f5f5f5; + background-color: #333333; +} +.panel-default > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ddd; +} + +.panel-primary { + border-color: #337ab7; +} +.panel-primary > .panel-heading { + color: #fff; + background-color: #337ab7; + border-color: #337ab7; +} +.panel-primary > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #337ab7; +} +.panel-primary > .panel-heading .badge { + color: #337ab7; + background-color: #fff; +} +.panel-primary > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #337ab7; +} + +.panel-success { + border-color: #d6e9c6; +} +.panel-success > .panel-heading { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} +.panel-success > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #d6e9c6; +} +.panel-success > .panel-heading .badge { + color: #dff0d8; + background-color: #3c763d; +} +.panel-success > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #d6e9c6; +} + +.panel-info { + border-color: #bce8f1; +} +.panel-info > .panel-heading { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} +.panel-info > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #bce8f1; +} +.panel-info > .panel-heading .badge { + color: #d9edf7; + background-color: #31708f; +} +.panel-info > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #bce8f1; +} + +.panel-warning { + border-color: #faebcc; +} +.panel-warning > .panel-heading { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} +.panel-warning > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #faebcc; +} +.panel-warning > .panel-heading .badge { + color: #fcf8e3; + background-color: #8a6d3b; +} +.panel-warning > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #faebcc; +} + +.panel-danger { + border-color: #ebccd1; +} +.panel-danger > .panel-heading { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} +.panel-danger > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ebccd1; +} +.panel-danger > .panel-heading .badge { + color: #f2dede; + background-color: #a94442; +} +.panel-danger > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ebccd1; +} + +.embed-responsive { + position: relative; + display: block; + height: 0; + padding: 0; + overflow: hidden; +} +.embed-responsive .embed-responsive-item, +.embed-responsive iframe, +.embed-responsive embed, +.embed-responsive object, +.embed-responsive video { + position: absolute; + top: 0; + left: 0; + bottom: 0; + height: 100%; + width: 100%; + border: 0; +} + +.embed-responsive-16by9 { + padding-bottom: 56.25%; +} + +.embed-responsive-4by3 { + padding-bottom: 75%; +} + +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); +} +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, 0.15); +} + +.well-lg { + padding: 24px; + border-radius: 6px; +} + +.well-sm { + padding: 9px; + border-radius: 3px; +} + +.close { + float: right; + font-size: 21px; + font-weight: bold; + line-height: 1; + color: #000; + text-shadow: 0 1px 0 #fff; + opacity: 0.2; + filter: alpha(opacity=20); +} +.close:hover, .close:focus { + color: #000; + text-decoration: none; + cursor: pointer; + opacity: 0.5; + filter: alpha(opacity=50); +} + +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} + +.modal-open { + overflow: hidden; +} + +.modal { + display: none; + overflow: hidden; + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1050; + -webkit-overflow-scrolling: touch; + outline: 0; +} +.modal.fade .modal-dialog { + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + -o-transform: translate(0, -25%); + transform: translate(0, -25%); + -webkit-transition: -webkit-transform 0.3s ease-out; + -moz-transition: -moz-transform 0.3s ease-out; + -o-transition: -o-transform 0.3s ease-out; + transition: transform 0.3s ease-out; +} +.modal.in .modal-dialog { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); +} + +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; +} + +.modal-dialog { + position: relative; + width: auto; + margin: 10px; +} + +.modal-content { + position: relative; + background-color: #fff; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 6px; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + background-clip: padding-box; + outline: 0; +} + +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000; +} +.modal-backdrop.fade { + opacity: 0; + filter: alpha(opacity=0); +} +.modal-backdrop.in { + opacity: 0.5; + filter: alpha(opacity=50); +} + +.modal-header { + padding: 15px; + border-bottom: 1px solid #e5e5e5; + min-height: 16.42857143px; +} + +.modal-header .close { + margin-top: -2px; +} + +.modal-title { + margin: 0; + line-height: 1.42857143; +} + +.modal-body { + position: relative; + padding: 15px; +} + +.modal-footer { + padding: 15px; + text-align: right; + border-top: 1px solid #e5e5e5; +} +.modal-footer:before, .modal-footer:after { + content: " "; + display: table; +} +.modal-footer:after { + clear: both; +} +.modal-footer .btn + .btn { + margin-left: 5px; + margin-bottom: 0; +} +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} +.modal-footer .btn-block + .btn-block { + margin-left: 0; +} + +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} + +@media (min-width: 768px) { + .modal-dialog { + width: 600px; + margin: 30px auto; + } + + .modal-content { + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); + } + + .modal-sm { + width: 300px; + } +} +@media (min-width: 992px) { + .modal-lg { + width: 900px; + } +} +.tooltip { + position: absolute; + z-index: 1070; + display: block; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-style: normal; + font-weight: normal; + letter-spacing: normal; + line-break: auto; + line-height: 1.42857143; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + white-space: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + font-size: 12px; + opacity: 0; + filter: alpha(opacity=0); +} +.tooltip.in { + opacity: 0.9; + filter: alpha(opacity=90); +} +.tooltip.top { + margin-top: -3px; + padding: 5px 0; +} +.tooltip.right { + margin-left: 3px; + padding: 0 5px; +} +.tooltip.bottom { + margin-top: 3px; + padding: 5px 0; +} +.tooltip.left { + margin-left: -3px; + padding: 0 5px; +} + +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #fff; + text-align: center; + background-color: #000; + border-radius: 4px; +} + +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} + +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.top-left .tooltip-arrow { + bottom: 0; + right: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.top-right .tooltip-arrow { + bottom: 0; + left: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: #000; +} +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: #000; +} +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.tooltip.bottom-left .tooltip-arrow { + top: 0; + right: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.tooltip.bottom-right .tooltip-arrow { + top: 0; + left: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: none; + max-width: 276px; + padding: 1px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-style: normal; + font-weight: normal; + letter-spacing: normal; + line-break: auto; + line-height: 1.42857143; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + white-space: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + font-size: 14px; + background-color: #fff; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); +} +.popover.top { + margin-top: -10px; +} +.popover.right { + margin-left: 10px; +} +.popover.bottom { + margin-top: 10px; +} +.popover.left { + margin-left: -10px; +} + +.popover-title { + margin: 0; + padding: 8px 14px; + font-size: 14px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-radius: 5px 5px 0 0; +} + +.popover-content { + padding: 9px 14px; +} + +.popover > .arrow, .popover > .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} + +.popover > .arrow { + border-width: 11px; +} + +.popover > .arrow:after { + border-width: 10px; + content: ""; +} + +.popover.top > .arrow { + left: 50%; + margin-left: -11px; + border-bottom-width: 0; + border-top-color: #999999; + border-top-color: rgba(0, 0, 0, 0.25); + bottom: -11px; +} +.popover.top > .arrow:after { + content: " "; + bottom: 1px; + margin-left: -10px; + border-bottom-width: 0; + border-top-color: #fff; +} +.popover.right > .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-left-width: 0; + border-right-color: #999999; + border-right-color: rgba(0, 0, 0, 0.25); +} +.popover.right > .arrow:after { + content: " "; + left: 1px; + bottom: -10px; + border-left-width: 0; + border-right-color: #fff; +} +.popover.bottom > .arrow { + left: 50%; + margin-left: -11px; + border-top-width: 0; + border-bottom-color: #999999; + border-bottom-color: rgba(0, 0, 0, 0.25); + top: -11px; +} +.popover.bottom > .arrow:after { + content: " "; + top: 1px; + margin-left: -10px; + border-top-width: 0; + border-bottom-color: #fff; +} +.popover.left > .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-right-width: 0; + border-left-color: #999999; + border-left-color: rgba(0, 0, 0, 0.25); +} +.popover.left > .arrow:after { + content: " "; + right: 1px; + border-right-width: 0; + border-left-color: #fff; + bottom: -10px; +} + +.carousel { + position: relative; +} + +.carousel-inner { + position: relative; + overflow: hidden; + width: 100%; +} +.carousel-inner > .item { + display: none; + position: relative; + -webkit-transition: 0.6s ease-in-out left; + -o-transition: 0.6s ease-in-out left; + transition: 0.6s ease-in-out left; +} +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + display: block; + max-width: 100%; + height: auto; + line-height: 1; +} +@media all and (transform-3d), (-webkit-transform-3d) { + .carousel-inner > .item { + -webkit-transition: -webkit-transform 0.6s ease-in-out; + -moz-transition: -moz-transform 0.6s ease-in-out; + -o-transition: -o-transform 0.6s ease-in-out; + transition: transform 0.6s ease-in-out; + -webkit-backface-visibility: hidden; + -moz-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-perspective: 1000px; + -moz-perspective: 1000px; + perspective: 1000px; + } + .carousel-inner > .item.next, .carousel-inner > .item.active.right { + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + left: 0; + } + .carousel-inner > .item.prev, .carousel-inner > .item.active.left { + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + left: 0; + } + .carousel-inner > .item.next.left, .carousel-inner > .item.prev.right, .carousel-inner > .item.active { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + left: 0; + } +} +.carousel-inner > .active, +.carousel-inner > .next, +.carousel-inner > .prev { + display: block; +} +.carousel-inner > .active { + left: 0; +} +.carousel-inner > .next, +.carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; +} +.carousel-inner > .next { + left: 100%; +} +.carousel-inner > .prev { + left: -100%; +} +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + left: 0; +} +.carousel-inner > .active.left { + left: -100%; +} +.carousel-inner > .active.right { + left: 100%; +} + +.carousel-control { + position: absolute; + top: 0; + left: 0; + bottom: 0; + width: 15%; + opacity: 0.5; + filter: alpha(opacity=50); + font-size: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); +} +.carousel-control.left { + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); +} +.carousel-control.right { + left: auto; + right: 0; + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); +} +.carousel-control:hover, .carousel-control:focus { + outline: 0; + color: #fff; + text-decoration: none; + opacity: 0.9; + filter: alpha(opacity=90); +} +.carousel-control .icon-prev, +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-left, +.carousel-control .glyphicon-chevron-right { + position: absolute; + top: 50%; + margin-top: -10px; + z-index: 5; + display: inline-block; +} +.carousel-control .icon-prev, +.carousel-control .glyphicon-chevron-left { + left: 50%; + margin-left: -10px; +} +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-right { + right: 50%; + margin-right: -10px; +} +.carousel-control .icon-prev, +.carousel-control .icon-next { + width: 20px; + height: 20px; + line-height: 1; + font-family: serif; +} +.carousel-control .icon-prev:before { + content: '\2039'; +} +.carousel-control .icon-next:before { + content: '\203a'; +} + +.carousel-indicators { + position: absolute; + bottom: 10px; + left: 50%; + z-index: 15; + width: 60%; + margin-left: -30%; + padding-left: 0; + list-style: none; + text-align: center; +} +.carousel-indicators li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + border: 1px solid #fff; + border-radius: 10px; + cursor: pointer; + background-color: #000 \9; + background-color: transparent; +} +.carousel-indicators .active { + margin: 0; + width: 12px; + height: 12px; + background-color: #fff; +} + +.carousel-caption { + position: absolute; + left: 15%; + right: 15%; + bottom: 20px; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); +} +.carousel-caption .btn { + text-shadow: none; +} + +@media screen and (min-width: 768px) { + .carousel-control .glyphicon-chevron-left, + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-prev, + .carousel-control .icon-next { + width: 30px; + height: 30px; + margin-top: -15px; + font-size: 30px; + } + .carousel-control .glyphicon-chevron-left, + .carousel-control .icon-prev { + margin-left: -15px; + } + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-next { + margin-right: -15px; + } + + .carousel-caption { + left: 20%; + right: 20%; + padding-bottom: 30px; + } + + .carousel-indicators { + bottom: 20px; + } +} +.clearfix:before, .clearfix:after { + content: " "; + display: table; +} +.clearfix:after { + clear: both; +} + +.center-block { + display: block; + margin-left: auto; + margin-right: auto; +} + +.pull-right { + float: right !important; +} + +.pull-left { + float: left !important; +} + +.hide { + display: none !important; +} + +.show { + display: block !important; +} + +.invisible { + visibility: hidden; +} + +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.hidden { + display: none !important; +} + +.affix { + position: fixed; +} + +@-ms-viewport { + width: device-width; +} +.visible-xs { + display: none !important; +} + +.visible-sm { + display: none !important; +} + +.visible-md { + display: none !important; +} + +.visible-lg { + display: none !important; +} + +.visible-xs-block, +.visible-xs-inline, +.visible-xs-inline-block, +.visible-sm-block, +.visible-sm-inline, +.visible-sm-inline-block, +.visible-md-block, +.visible-md-inline, +.visible-md-inline-block, +.visible-lg-block, +.visible-lg-inline, +.visible-lg-inline-block { + display: none !important; +} + +@media (max-width: 767px) { + .visible-xs { + display: block !important; + } + + table.visible-xs { + display: table !important; + } + + tr.visible-xs { + display: table-row !important; + } + + th.visible-xs, + td.visible-xs { + display: table-cell !important; + } +} +@media (max-width: 767px) { + .visible-xs-block { + display: block !important; + } +} + +@media (max-width: 767px) { + .visible-xs-inline { + display: inline !important; + } +} + +@media (max-width: 767px) { + .visible-xs-inline-block { + display: inline-block !important; + } +} + +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm { + display: block !important; + } + + table.visible-sm { + display: table !important; + } + + tr.visible-sm { + display: table-row !important; + } + + th.visible-sm, + td.visible-sm { + display: table-cell !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-block { + display: block !important; + } +} + +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline { + display: inline !important; + } +} + +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline-block { + display: inline-block !important; + } +} + +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md { + display: block !important; + } + + table.visible-md { + display: table !important; + } + + tr.visible-md { + display: table-row !important; + } + + th.visible-md, + td.visible-md { + display: table-cell !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-block { + display: block !important; + } +} + +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline { + display: inline !important; + } +} + +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline-block { + display: inline-block !important; + } +} + +@media (min-width: 1200px) { + .visible-lg { + display: block !important; + } + + table.visible-lg { + display: table !important; + } + + tr.visible-lg { + display: table-row !important; + } + + th.visible-lg, + td.visible-lg { + display: table-cell !important; + } +} +@media (min-width: 1200px) { + .visible-lg-block { + display: block !important; + } +} + +@media (min-width: 1200px) { + .visible-lg-inline { + display: inline !important; + } +} + +@media (min-width: 1200px) { + .visible-lg-inline-block { + display: inline-block !important; + } +} + +@media (max-width: 767px) { + .hidden-xs { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .hidden-sm { + display: none !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-md { + display: none !important; + } +} +@media (min-width: 1200px) { + .hidden-lg { + display: none !important; + } +} +.visible-print { + display: none !important; +} + +@media print { + .visible-print { + display: block !important; + } + + table.visible-print { + display: table !important; + } + + tr.visible-print { + display: table-row !important; + } + + th.visible-print, + td.visible-print { + display: table-cell !important; + } +} +.visible-print-block { + display: none !important; +} +@media print { + .visible-print-block { + display: block !important; + } +} + +.visible-print-inline { + display: none !important; +} +@media print { + .visible-print-inline { + display: inline !important; + } +} + +.visible-print-inline-block { + display: none !important; +} +@media print { + .visible-print-inline-block { + display: inline-block !important; + } +} + +@media print { + .hidden-print { + display: none !important; + } +} +.well { + -webkit-box-shadow: rgba(255, 255, 255, 0.1) 0 1px 0, rgba(0, 0, 0, 0.8) 0 1px 7px 0px inset; + box-shadow: rgba(255, 255, 255, 0.1) 0 1px 0, rgba(0, 0, 0, 0.8) 0 1px 7px 0px inset; + background: #202020; + background-color: rgba(0, 0, 0, 0.3); + border: 0; +} + +.darkwell, .breadcrumb, code, pre, select, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input, +.form-control, textarea, .jumbotron, .progress { + -webkit-box-shadow: rgba(255, 255, 255, 0.1) 0 1px 0, rgba(0, 0, 0, 0.8) 0 1px 7px 0px inset; + box-shadow: rgba(255, 255, 255, 0.1) 0 1px 0, rgba(0, 0, 0, 0.8) 0 1px 7px 0px inset; + background: #202020; + background-color: rgba(0, 0, 0, 0.3); + border: 0; +} + +.breadcrumb { + border: 0; +} +.breadcrumb li { + text-shadow: 0 1px 0 #000; +} + +.page-header { + -webkit-box-shadow: rgba(255, 255, 255, 0.07) 0 1px 0; + box-shadow: rgba(255, 255, 255, 0.07) 0 1px 0; + border-bottom: 1px solid #121212; +} + +h1, h2, h3, h4, h5, h6 { + color: #fff; +} + +h6 { + color: #999; +} + +blockquote { + border-left-color: #111; +} +blockquote.pull-right { + border-right-color: #111; +} + +hr { + -webkit-box-shadow: rgba(255, 255, 255, 0.07) 0 1px 0; + box-shadow: rgba(255, 255, 255, 0.07) 0 1px 0; + border-bottom: 1px solid #121212; + border-top: none; +} + +code { + border: none; + padding: 2px 4px; +} + +pre { + border: none; + color: #c6c6c6; + padding: 8px; +} + +legend { + -webkit-box-shadow: rgba(255, 255, 255, 0.07) 0 1px 0; + box-shadow: rgba(255, 255, 255, 0.07) 0 1px 0; + border-bottom: 1px solid #121212; + color: #fff; +} + +select, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input, +.form-control { + color: #fff; + height: 34px; +} +select::-moz-placeholder, +input[type="text"]::-moz-placeholder, +input[type="password"]::-moz-placeholder, +input[type="datetime"]::-moz-placeholder, +input[type="datetime-local"]::-moz-placeholder, +input[type="date"]::-moz-placeholder, +input[type="month"]::-moz-placeholder, +input[type="time"]::-moz-placeholder, +input[type="week"]::-moz-placeholder, +input[type="number"]::-moz-placeholder, +input[type="email"]::-moz-placeholder, +input[type="url"]::-moz-placeholder, +input[type="search"]::-moz-placeholder, +input[type="tel"]::-moz-placeholder, +input[type="color"]::-moz-placeholder, +.uneditable-input::-moz-placeholder, +.form-control::-moz-placeholder { + color: #999; + opacity: 1; +} +select:-ms-input-placeholder, +input[type="text"]:-ms-input-placeholder, +input[type="password"]:-ms-input-placeholder, +input[type="datetime"]:-ms-input-placeholder, +input[type="datetime-local"]:-ms-input-placeholder, +input[type="date"]:-ms-input-placeholder, +input[type="month"]:-ms-input-placeholder, +input[type="time"]:-ms-input-placeholder, +input[type="week"]:-ms-input-placeholder, +input[type="number"]:-ms-input-placeholder, +input[type="email"]:-ms-input-placeholder, +input[type="url"]:-ms-input-placeholder, +input[type="search"]:-ms-input-placeholder, +input[type="tel"]:-ms-input-placeholder, +input[type="color"]:-ms-input-placeholder, +.uneditable-input:-ms-input-placeholder, +.form-control:-ms-input-placeholder { + color: #999; +} +select::-webkit-input-placeholder, +input[type="text"]::-webkit-input-placeholder, +input[type="password"]::-webkit-input-placeholder, +input[type="datetime"]::-webkit-input-placeholder, +input[type="datetime-local"]::-webkit-input-placeholder, +input[type="date"]::-webkit-input-placeholder, +input[type="month"]::-webkit-input-placeholder, +input[type="time"]::-webkit-input-placeholder, +input[type="week"]::-webkit-input-placeholder, +input[type="number"]::-webkit-input-placeholder, +input[type="email"]::-webkit-input-placeholder, +input[type="url"]::-webkit-input-placeholder, +input[type="search"]::-webkit-input-placeholder, +input[type="tel"]::-webkit-input-placeholder, +input[type="color"]::-webkit-input-placeholder, +.uneditable-input::-webkit-input-placeholder, +.form-control::-webkit-input-placeholder { + color: #999; +} + +.form-control.input-lg, .input-group-lg > .form-control, +.input-group-lg > .input-group-btn > .form-control.btn { + height: 45px; +} + +textarea { + color: #fff; +} +textarea::-moz-placeholder { + color: #999; + opacity: 1; +} +textarea:-ms-input-placeholder { + color: #999; +} +textarea::-webkit-input-placeholder { + color: #999; +} + +select { + height: 29px; +} + +.form-actions { + border-top-color: #222; +} + +.well .form-actions { + border-top-color: #000; + background-color: rgba(0, 0, 0, 0.3); + margin-left: -17px; + margin-right: -17px; + margin-bottom: -17px; +} + +.help-inline, +.help-block { + color: #999; +} + +tr.warning, +tr.success, +tr.error, +tr.info { + color: #fff; +} + +.control-group.warning input, .control-group.warning select, .control-group.warning textarea { + color: #faa732; + border-color: #faa732; + -webkit-box-shadow: rgba(255, 255, 255, 0.1) 0 1px 0, rgba(0, 0, 0, 0.8) 0 1px 7px 0px inset; + box-shadow: rgba(255, 255, 255, 0.1) 0 1px 0, rgba(0, 0, 0, 0.8) 0 1px 7px 0px inset; + background: #202020; + background-color: rgba(0, 0, 0, 0.3); +} +.control-group.warning input:focus, +.control-group.warning select:focus, +.control-group.warning textarea:focus { + border-color: #faa732; + -webkit-box-shadow: 0 0 6px #faa732; + box-shadow: 0 0 6px #faa732; +} +.control-group.warning .control-label, +.control-group.warning .help-block, +.control-group.warning .help-inline { + color: #faa732; +} +.control-group.success input, .control-group.success select, .control-group.success textarea { + color: #5bb75b; + border-color: #5bb75b; + -webkit-box-shadow: rgba(255, 255, 255, 0.1) 0 1px 0, rgba(0, 0, 0, 0.8) 0 1px 7px 0px inset; + box-shadow: rgba(255, 255, 255, 0.1) 0 1px 0, rgba(0, 0, 0, 0.8) 0 1px 7px 0px inset; + background: #202020; + background-color: rgba(0, 0, 0, 0.3); +} +.control-group.success input:focus, +.control-group.success select:focus, +.control-group.success textarea:focus { + border-color: #5bb75b; + -webkit-box-shadow: 0 0 6px #5bb75b; + box-shadow: 0 0 6px #5bb75b; +} +.control-group.success .control-label, +.control-group.success .help-block, +.control-group.success .help-inline { + color: #5bb75b; +} +.control-group.error input, .control-group.error select, .control-group.error textarea { + color: #fc5b5e; + border-color: #fc5b5e; + -webkit-box-shadow: rgba(255, 255, 255, 0.1) 0 1px 0, rgba(0, 0, 0, 0.8) 0 1px 7px 0px inset; + box-shadow: rgba(255, 255, 255, 0.1) 0 1px 0, rgba(0, 0, 0, 0.8) 0 1px 7px 0px inset; + background: #202020; + background-color: rgba(0, 0, 0, 0.3); +} +.control-group.error input:focus, +.control-group.error select:focus, +.control-group.error textarea:focus { + border-color: #fc5b5e; + -webkit-box-shadow: 0 0 6px #fc5b5e; + box-shadow: 0 0 6px #fc5b5e; +} +.control-group.error .control-label, +.control-group.error .help-block, +.control-group.error .help-inline { + color: #fc5b5e; +} +.control-group.info input, .control-group.info select, .control-group.info textarea { + color: #3a87ad; + border-color: #3a87ad; + -webkit-box-shadow: rgba(255, 255, 255, 0.1) 0 1px 0, rgba(0, 0, 0, 0.8) 0 1px 7px 0px inset; + box-shadow: rgba(255, 255, 255, 0.1) 0 1px 0, rgba(0, 0, 0, 0.8) 0 1px 7px 0px inset; + background: #202020; + background-color: rgba(0, 0, 0, 0.3); +} +.control-group.info input:focus, +.control-group.info select:focus, +.control-group.info textarea:focus { + border-color: #3a87ad; + -webkit-box-shadow: 0 0 6px #3a87ad; + box-shadow: 0 0 6px #3a87ad; +} +.control-group.info .control-label, +.control-group.info .help-block, +.control-group.info .help-inline { + color: #3a87ad; +} + +input:focus:invalid, +textarea:focus:invalid, +select:focus:invalid { + border-color: #fc5b5e; +} + +input:focus:invalid:focus, +textarea:focus:invalid:focus, +select:focus:invalid:focus { + border-color: #fc5b5e; + box-shadow: 0 0 6px #fc5b5e; +} + +.btn-link { + text-shadow: none; +} + +.img-polaroid { + background-color: #111; + background-color: rgba(0, 0, 0, 0.3); +} + +.nav-tabs .open .dropdown-toggle, +.nav-pills .open .dropdown-toggle, +.nav > .open.active > a:hover { + background-color: rgba(0, 0, 0, 0.25); + border-color: transparent transparent #666 transparent; +} + +.nav > .dropdown.active > a:hover { + color: #fff; +} + +.nav-tabs .active .dropdown-toggle .caret, +.nav-pills .active .dropdown-toggle .caret { + border-top-color: #fff; +} + +.nav-tabs { + border-bottom: 1px solid #666; +} +.nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus { + background-color: #2f2f2f; + color: #fff; + border-color: #666 #666 transparent #666; +} +.nav-tabs > li > a:hover { + border-color: #2f2f2f #2f2f2f #666 #2f2f2f; + background-color: rgba(0, 0, 0, 0.25); + color: #00aaff; +} +.nav-tabs.nav-stacked > li > a, .nav-tabs.nav-stacked > li > a:hover { + border-color: #666; +} + +.well > .nav-tabs > .active > a, .well > .nav-tabs > .active > a:hover { + background-color: #202020; +} + +.nav-pills > li > a:hover { + background-color: rgba(0, 0, 0, 0.25); + color: #00aaff; +} + +.nav-list > li > a, +.nav-list .nav-header { + text-shadow: 0 1px 0 #000; +} + +.nav-list > li > a:hover { + background-color: rgba(0, 0, 0, 0.25); + color: #00aaff; +} + +.nav-list .active > a:hover { + background-color: #0088cc; + color: #fff; +} + +.tabs-below .nav-tabs { + border-top: 1px solid #666; +} + +.tabs-left .nav-tabs { + border-right: 1px solid #666; +} + +.tabs-right .nav-tabs { + border-left: 1px solid #666; +} + +.tabs-below .nav-tabs > li > a:hover { + border-top: 1px solid #666; +} + +.tabs-left .nav-tabs > li > a:hover { + border-color: transparent #666 transparent transparent; +} + +.tabs-right .nav-tabs > li > a:hover { + border-color: transparent transparent transparent #666; +} + +.tabs-below .nav-tabs .active > a, +.tabs-below .nav-tabs .active > a:hover { + border-color: transparent #666 #666 #666; +} + +.tabs-left .nav-tabs .active > a, +.tabs-left .nav-tabs .active > a:hover { + border-color: #666 transparent #666 #666; +} + +.tabs-right .nav-tabs .active > a, +.tabs-right .nav-tabs .active > a:hover { + border-color: #666 #666 #666 transparent; +} + +.nav-list > li > a, +.nav-list .nav-header { + text-shadow: 0 1px 0 rgba(0, 0, 0, 0.5); +} + +.nav-tabs > li > a:hover { + border-color: transparent transparent #666 transparent; +} + +.nav > .disabled > a:hover { + color: #999; +} + +.nav-list .divider { + background-color: transparent; + -webkit-box-shadow: rgba(255, 255, 255, 0.07) 0 1px 0; + box-shadow: rgba(255, 255, 255, 0.07) 0 1px 0; + border-bottom: 1px solid #121212; +} + +.navbar .brand { + text-shadow: 0 1px 0 black; +} + +.navbar .nav-divider { + border: transparent; + -webkit-box-shadow: rgba(255, 255, 255, 0.07) 1px 0 0; + box-shadow: rgba(255, 255, 255, 0.07) 1px 0 0; + border-right: 1px solid #121212; +} + +.navbar-inverse .brand { + color: #555; +} +.navbar-inverse .brand:hover { + color: #555; +} +.navbar-inverse .navbar-default { + background: #333; + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.5); +} +.navbar-inverse .nav > li > a { + color: #c6c6c6; +} +.navbar-inverse .nav > li > a:hover { + color: #fff; +} +.navbar-inverse .nav > .active > a, +.navbar-inverse .nav > .active > a:hover { + background-color: #e5e5e5; + box-shadow: 0 3px 8px rgba(0, 0, 0, 0.125) inset; + color: #555; +} +.navbar-inverse .nav li.dropdown > a:hover .caret { + border-bottom-color: #fff; + border-top-color: #fff; + color: #fff; +} +.navbar-inverse .nav > li > a:focus, +.navbar-inverse .nav > li > a:hover { + background-color: transparent; + color: #fff; +} +.navbar-inverse .nav li.dropdown.open > .dropdown-toggle, +.navbar-inverse .nav li.dropdown.active > .dropdown-toggle, +.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle { + background-color: #e5e5e5; + color: #555; +} +.navbar-inverse .nav li.dropdown.open > .dropdown-toggle, +.navbar-inverse .nav li.dropdown.active > .dropdown-toggle, +.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle { + background-color: #e5e5e5; + color: #555; +} +.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret, +.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret, +.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret { + border-bottom-color: #c6c6c6; + border-top-color: #c6c6c6; + color: #c6c6c6; +} +.navbar-inverse .navbar-search .search-query { + box-shadow: 0 3px 8px rgba(0, 0, 0, 0.6) inset; + background-color: #fff; + color: #555; +} +.navbar-inverse .navbar-search input.search-query:focus { + box-shadow: 0 3px 8px rgba(0, 0, 0, 0.6) inset, 0 0 8px rgba(82, 168, 236, 0.9); + padding: 4px 14px; + outline: 0 none; +} +.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret { + border-bottom-color: #c6c6c6; + border-top-color: #c6c6c6; +} +.navbar-inverse .nav li.dropdown > a:hover .caret { + border-bottom-color: #fff; + border-top-color: #fff; +} +.navbar-inverse .navbar-search .search-query:-moz-placeholder { + color: #999; +} + +.pagination > li > a, +.pagination > li > span { + background: transparent; + border-color: #666; +} + +.pagination > li > a:hover, +.pagination > .active > a, +.pagination > .active > span { + background-color: rgba(0, 0, 0, 0.25); +} + +.pager li > a, .pager li > span { + background-color: transparent; + border-color: #666; +} + +.pager li > a:hover { + background-color: rgba(0, 0, 0, 0.25); +} + +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > span { + background-color: transparent; +} + +.label, +.badge { + text-shadow: 1px 1px 0 black; + box-shadow: 1px 1px 0 black; +} + +.label-inverse, +.badge-inverse { + background-color: #111; +} + +.btn-inverse { + background-color: #373737; +} + +.btn-inverse, +.btn-inverse:hover { + color: #C6C6C6; +} + +a.list-group-item.active > .badge, +.nav-pills > .active > a > .badge { + color: #fff; + background-color: #2f2f2f; +} + +.jumbotron { + background: #111; + color: #ccc; +} + +.thumbnail { + display: inline-block; + display: block; + height: auto; + max-width: 100%; + padding: 4px; + line-height: 1.428571429; + background-color: #333333; + border: 1px solid #dddddd; + border-radius: 4px; + -webkit-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} +.thumbnail .caption { + color: #999; +} + +.alert { + color: #fff; + border-color: #a86404; +} +.alert h1, .alert h2, .alert h3, .alert h4, .alert h5, .alert h6 { + color: #c17305; +} + +.alert-error { + border-color: #d40408; +} +.alert-error h1, .alert-error h2, .alert-error h3, .alert-error h4, .alert-error h5, .alert-error h6 { + color: #ed0409; +} + +.alert-success { + border-color: #2d662d; +} +.alert-success h1, .alert-success h2, .alert-success h3, .alert-success h4, .alert-success h5, .alert-success h6 { + color: #347834; +} + +.alert-info { + border-color: #1a3c4e; +} +.alert-info h1, .alert-info h2, .alert-info h3, .alert-info h4, .alert-info h5, .alert-info h6 { + color: #204b61; +} + +select::-webkit-scrollbar { + -webkit-appearance: none; + width: 11px; +} +select::-webkit-scrollbar-thumb { + border-radius: 8px; + border: 2px solid #202020; + /* should match background, can't be transparent */ + background-color: rgba(0, 0, 0, 0.5); +} + +.modal, +.modal-content { + background-color: #444; +} + +.modal-header { + border-bottom: 1px solid #222; +} + +.modal-body p { + color: #c6c6c6; +} + +.modal-footer { + background-color: #373737; + border-top: 1px solid #222; + -moz-box-shadow: 0 1px 0 #333333 inset; + -webkit-box-shadow: 0 1px 0 #333333 inset; + -o-box-shadow: 0 1px 0 #333333 inset; + box-shadow: 0 1px 0 #333333 inset; +} + +.popover { + background: #444; + border: 1px solid rgba(0, 0, 0, 0.5); + border: 1px solid black; +} + +.popover-title { + background: #373737; + border-bottom-color: #222; +} + +.popover.top .arrow:after { + border-top-color: #444; +} + +.popover.right .arrow:after { + border-right-color: #444; +} + +.popover.bottom .arrow:after { + border-bottom-color: #444; +} + +.popover.left .arrow:after { + border-left-color: #444; +} + +.dropdown-menu, +.dropdown-menu > li > a { + color: #c6c6c6; + background: #373737; +} + +.dropdown-menu > li > a:focus, +.dropdown-menu > li > a:hover { + color: #fff; + background-image: -webkit-linear-gradient(top, #080808 0, #0f0f0f 100%); + background-image: -o-linear-gradient(top, #080808 0, #0f0f0f 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f)); + background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + background-repeat: repeat-x; +} + +.alert { + background-image: -webkit-linear-gradient(top, #faa732 0, #c17305 100%); + background-image: -o-linear-gradient(top, #faa732 0, #c17305 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#faa732), to(#c17305)); + background-image: linear-gradient(to bottom, #faa732 0%, #c17305 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3a87ad', endColorstr='#ff1a3c4e', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + background-repeat: repeat-x; +} + +.alert-error { + background-image: -webkit-linear-gradient(top, #fc5b5e 0, #d40408 100%); + background-image: -o-linear-gradient(top, #fc5b5e 0, #d40408 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#fc5b5e), to(#d40408)); + background-image: linear-gradient(to bottom, #fc5b5e 0%, #d40408 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3a87ad', endColorstr='#ff1a3c4e', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + background-repeat: repeat-x; +} + +.alert-success { + background-image: -webkit-linear-gradient(top, #5bb75b 0, #2d662d 100%); + background-image: -o-linear-gradient(top, #5bb75b 0, #2d662d 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#5bb75b), to(#2d662d)); + background-image: linear-gradient(to bottom, #5bb75b 0%, #2d662d 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3a87ad', endColorstr='#ff1a3c4e', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + background-repeat: repeat-x; +} + +.alert-info { + background-image: -webkit-linear-gradient(top, #3a87ad 0, #1a3c4e 100%); + background-image: -o-linear-gradient(top, #3a87ad 0, #1a3c4e 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#3a87ad), to(#1a3c4e)); + background-image: linear-gradient(to bottom, #3a87ad 0%, #1a3c4e 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3a87ad', endColorstr='#ff1a3c4e', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + background-repeat: repeat-x; +} diff --git a/css/bootstrap/fonts/glyphicons-halflings-regular.eot b/css/bootstrap/fonts/glyphicons-halflings-regular.eot new file mode 100644 index 0000000000000000000000000000000000000000..b93a4953fff68df523aa7656497ee339d6026d64 GIT binary patch literal 20127 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/css/bootstrap/fonts/glyphicons-halflings-regular.ttf b/css/bootstrap/fonts/glyphicons-halflings-regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1413fc609ab6f21774de0cb7e01360095584f65b GIT binary patch literal 45404 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 G`u_lkUM?>H literal 0 HcmV?d00001 diff --git a/css/bootstrap/fonts/glyphicons-halflings-regular.woff2 b/css/bootstrap/fonts/glyphicons-halflings-regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..64539b54c3751a6d9adb44c8e3a45ba5a73b77f0 GIT binary patch literal 18028 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 literal 0 HcmV?d00001 diff --git a/css/bootstrap/privatebin.css b/css/bootstrap/privatebin.css new file mode 100644 index 00000000..392966f6 --- /dev/null +++ b/css/bootstrap/privatebin.css @@ -0,0 +1,207 @@ +/** + * PrivateBin + * + * a zero-knowledge paste bin + * + * @link https://github.com/PrivateBin/PrivateBin + * @copyright 2012 Sébastien SAUVAGE (sebsauvage.net) + * @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License + * @version 1.3.2 + */ + +body { + padding: 0 0 30px; +} + +body.navbar-spacing { + padding-top: 70px; +} + +body.loading { + cursor: wait; +} + +.buttondisabled { + opacity: 0.3; +} + +.navbar-nav { + margin: 0 8px; +} + +.nav.navbar-nav > li { + margin-left: 8px; +} + +.navbar-brand { + padding: 6px 4px 0 8px; +} + +.navbar-form { + padding: 0; +} + +.dropdown-menu > li > label, .dropdown-menu > li > div { + clear: both; + display: block; + font-weight: normal; + line-height: 1.42857; + white-space: nowrap; +} + +.dropdown-menu > li > label { + color: #333; + padding: 3px 20px 3px 40px; +} + +.dropdown-menu > li > div { + color: #777; + padding: 3px 20px; + cursor: default; +} + +.pull-right .dropdown-menu { + margin-left: -5em; +} + +#language { + margin-right: 8px; +} + +#attachmentPreview img { + max-width: 100%; + height: auto; + margin-bottom: 20px; +} + +#attachmentPreview .pdfPreview { + width: 100%; + height: 100vh; + margin-bottom: 20px; +} + +#dropzone { + text-align: center; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 1000; + opacity: 0.6; + background-color: #99ccff; + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath d='M0 0h24v24H0z' fill='none'/%3E%3Cpath d='M19.35 10.04C18.67 6.59 15.64 4 12 4 9.11 4 6.6 5.64 5.35 8.04 2.34 8.36 0 10.91 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zM14 13v4h-4v-4H7l5-5 5 5h-3z'/%3E%3C/svg%3E"); + background-repeat: no-repeat; + background-position: center; + background-size: 25vh; + outline: 2px dashed #228bff; + outline-offset: -50px; +} + +.dragAndDropFile{ + color: #777; + font-size: 1em; + display: inline; + white-space: normal; +} + +#deletelink { + float: right; + margin-left: 5px; +} + +#qrcodemodalClose { + float: right; +} +#qrcode-display { + width: 200px; + height: 200px; + margin: auto; +} + +#pastelink { + display: inline; +} + +#pastelink > a { + word-wrap: break-word; +} + +#preview { + margin-bottom: 10px; +} + +#message, .replymessage { + font-family: monospace; + resize: vertical; +} + +#nickname { + margin: 5px 0; +} + +#comments, #comments button { + margin-bottom: 10px; +} + +#filewrap { + transition: background-color 0.75s ease-out; +} + +.comment { + border-left: 1px solid #ccc; + padding: 5px 0 5px 10px; + white-space: pre-wrap; + transition: background-color 0.75s ease-out; +} + +.highlight { + background-color: #ffdd86; + transition: background-color 0.2s ease-in; +} + +footer h4 { + margin-top: 0; +} + +li.L0, li.L1, li.L2, li.L3, li.L5, li.L6, li.L7, li.L8 { + list-style-type: decimal !important; +} + +.dark-theme .alert-info .alert-link { + color: #fff; +} + +/* address 2K or 4K monitors when using bootstrap 3 */ +@media (min-width: 1280px) { + .container { + width: 100%; + padding-left: 4ch; + padding-right: 4ch; + } +} + +.modal-dialog { + margin: auto !important; +} + +/* makeup for the original margin on modal-dialog */ +@media (min-width: 768px) { + .modal-content { + margin: 30px 0; + } +} + +.modal-content { + margin: 10px; +} + +.modal-body { + display: flex; + justify-content: center; + align-items: center; +} + +.modal .modal-content button { + margin: 0.5em 0; +} diff --git a/css/noscript.css b/css/noscript.css new file mode 100644 index 00000000..6d71476d --- /dev/null +++ b/css/noscript.css @@ -0,0 +1,15 @@ +/** + * PrivateBin + * + * CSS file only loaded when no JavaScript available. + * + * @link https://github.com/PrivateBin/PrivateBin + * @copyright 2012 Sébastien SAUVAGE (sebsauvage.net) + * @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License + * @version 1.3.2 + */ + +/* When there is no script at all other */ +.noscript-hide { + display: none; +} diff --git a/css/prettify/desert.css b/css/prettify/desert.css new file mode 100644 index 00000000..138debe9 --- /dev/null +++ b/css/prettify/desert.css @@ -0,0 +1 @@ +pre .atn,pre .kwd,pre .tag{font-weight:700}pre.prettyprint{display:block;background-color:#333}pre .nocode{background-color:none;color:#000}pre .str{color:#ffa0a0}pre .kwd{color:khaki}pre .com{color:#87ceeb}pre .typ{color:#98fb98}pre .lit{color:#cd5c5c}pre .pln,pre .pun{color:#fff}pre .tag{color:khaki}pre .atn{color:#bdb76b}pre .atv{color:#ffa0a0}pre .dec{color:#98fb98}ol.linenums{margin-top:0;margin-bottom:0;color:#AEAEAE}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}@media print{pre.prettyprint{background-color:none}code .str,pre .str{color:#060}code .kwd,pre .kwd{color:#006;font-weight:700}code .com,pre .com{color:#600;font-style:italic}code .typ,pre .typ{color:#404;font-weight:700}code .lit,pre .lit{color:#044}code .pun,pre .pun{color:#440}code .pln,pre .pln{color:#000}code .tag,pre .tag{color:#006;font-weight:700}code .atn,pre .atn{color:#404}code .atv,pre .atv{color:#060}} \ No newline at end of file diff --git a/css/prettify/doxy.css b/css/prettify/doxy.css new file mode 100644 index 00000000..8494b449 --- /dev/null +++ b/css/prettify/doxy.css @@ -0,0 +1 @@ +a,code.prettyprint a,pre.prettyprint a{text-decoration:none}code .str,pre .str{color:#fec243}code .kwd,pre .kwd{color:#8470FF}code .com,pre .com{color:#32cd32;font-style:italic}code .typ,pre .typ{color:#6ecbcc}code .lit,pre .lit{color:#d06}code .pun,pre .pun{color:#8B8970}code .pln,pre .pln{color:#f0f0f0}code .tag,pre .tag{color:#9c9cff}code .htm,pre .htm{color:plum}code .xsl,pre .xsl{color:#d0a0d0}code .atn,pre .atn{color:#46eeee;font-weight:400}code .atv,pre .atv{color:#EEB4B4}code .dec,pre .dec{color:#3387CC}code.prettyprint,pre.prettyprint{font-family:'Droid Sans Mono','CPMono_v07 Bold','Droid Sans';font-weight:700;font-size:9pt;background-color:#0f0f0f;-moz-border-radius:8px;-webkit-border-radius:8px;-o-border-radius:8px;-ms-border-radius:8px;-khtml-border-radius:8px;border-radius:8px}pre.prettyprint{width:95%;margin:1em auto;padding:1em;white-space:pre-wrap}ol.linenums{margin-top:0;margin-bottom:0;color:#8B8970}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}@media print{code.prettyprint,pre.prettyprint{background-color:#fff}code .str,pre .str{color:#088}code .kwd,pre .kwd{color:#006;font-weight:700}code .com,pre .com{color:#oc3;font-style:italic}code .typ,pre .typ{color:#404;font-weight:700}code .lit,pre .lit{color:#044}code .pun,pre .pun{color:#440}code .pln,pre .pln{color:#000}code .tag,pre .tag{color:#b66ff7;font-weight:700}code .htm,code .xsl,pre .htm,pre .xsl{color:#606;font-weight:700}code .atn,pre .atn{color:#c71585;font-weight:400}code .atv,pre .atv{color:#088;font-weight:400}} \ No newline at end of file diff --git a/css/prettify/prettify.css b/css/prettify/prettify.css new file mode 100644 index 00000000..e6fe342f --- /dev/null +++ b/css/prettify/prettify.css @@ -0,0 +1 @@ +.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.clo,.opn,.pun{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.kwd,.tag,.typ{font-weight:700}.str{color:#060}.kwd{color:#006}.com{color:#600;font-style:italic}.typ{color:#404}.lit{color:#044}.clo,.opn,.pun{color:#440}.tag{color:#006}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} \ No newline at end of file diff --git a/css/prettify/sons-of-obsidian.css b/css/prettify/sons-of-obsidian.css new file mode 100644 index 00000000..aa078a68 --- /dev/null +++ b/css/prettify/sons-of-obsidian.css @@ -0,0 +1 @@ +.str{color:#EC7600}.kwd{color:#93C763}.com{color:#66747B}.typ{color:#678CB1}.lit{color:#FACD22}.pln,.pun{color:#F1F2F3}.tag{color:#8AC763}.atn{color:#E0E2E4}.atv{color:#EC7600}.dec{color:purple}pre.prettyprint{border:0 solid #888}ol.linenums{margin-top:0;margin-bottom:0}.prettyprint{background:#000}li.L0,li.L1,li.L2,li.L3,li.L4,li.L5,li.L6,li.L7,li.L8,li.L9{color:#555;list-style-type:decimal}li.L1,li.L3,li.L5,li.L7,li.L9{background:#111}@media print{.kwd,.tag,.typ{font-weight:700}.str{color:#060}.kwd{color:#006}.com{color:#600;font-style:italic}.typ{color:#404}.lit{color:#044}.pun{color:#440}.pln{color:#000}.tag{color:#006}.atn{color:#404}.atv{color:#060}} \ No newline at end of file diff --git a/css/prettify/sunburst.css b/css/prettify/sunburst.css new file mode 100644 index 00000000..8eb58781 --- /dev/null +++ b/css/prettify/sunburst.css @@ -0,0 +1 @@ +code .str,pre .str{color:#65B042}code .kwd,pre .kwd{color:#E28964}code .com,pre .com{color:#AEAEAE;font-style:italic}code .typ,pre .typ{color:#89bdff}code .lit,pre .lit{color:#3387CC}code .pln,code .pun,pre .pln,pre .pun{color:#fff}code .tag,pre .tag{color:#89bdff}code .atn,pre .atn{color:#bdb76b}code .atv,pre .atv{color:#65B042}code .dec,pre .dec{color:#3387CC}code.prettyprint,pre.prettyprint{background-color:#000;border-radius:8px}pre.prettyprint{width:95%;margin:1em auto;padding:1em;white-space:pre-wrap}ol.linenums{margin-top:0;margin-bottom:0;color:#AEAEAE}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}@media print{code .str,pre .str{color:#060}code .kwd,pre .kwd{color:#006;font-weight:700}code .com,pre .com{color:#600;font-style:italic}code .typ,pre .typ{color:#404;font-weight:700}code .lit,pre .lit{color:#044}code .pun,pre .pun{color:#440}code .pln,pre .pln{color:#000}code .tag,pre .tag{color:#006;font-weight:700}code .atn,pre .atn{color:#404}code .atv,pre .atv{color:#060}} \ No newline at end of file diff --git a/css/privatebin.css b/css/privatebin.css new file mode 100644 index 00000000..ae32f2e1 --- /dev/null +++ b/css/privatebin.css @@ -0,0 +1,486 @@ +/** + * PrivateBin + * + * Main CSS file. + * + * @link https://github.com/PrivateBin/PrivateBin + * @copyright 2012 Sébastien SAUVAGE (sebsauvage.net) + * @license https://www.opensource.org/licenses/zlib-license.php The zlib/libpng License + * @version 1.3.2 + */ + +/* CSS Reset from YUI 3.4.1 (build 4118) - Copyright 2011 Yahoo! Inc. All rights reserved. +Licensed under the BSD License. - http://yuilibrary.com/license/ */ +html{color:#000;background:#fff}body,div,dl,dt,dd,ul,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;padding:0}table{border-collapse:collapse;border-spacing:0}fieldset,img{border:0}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal}ol,ul{list-style:none}caption,th{text-align:left}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}q:before,q:after{content:''}abbr,acronym{border:0;font-variant:normal}sup{vertical-align:text-top}sub{vertical-align:text-bottom}input,textarea,select{font-family:inherit;font-size:inherit;font-weight:inherit}input,textarea,select{font-size:100%;}legend{color:#000} + +html { + background-color: #455463; + color: #fff; + min-height: 100%; + background-image: linear-gradient(bottom, #0f1823 0, #455463 100%); + background-image: -o-linear-gradient(bottom, #0f1823 0, #455463 100%); + background-image: -moz-linear-gradient(bottom, #0f1823 0, #455463 100%); + background-image: -webkit-linear-gradient(bottom, #0f1823 0, #455463 100%); + background-image: -ms-linear-gradient(bottom, #0f1823 0, #455463 100%); + background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #0f1823), color-stop(1, #455463)); +} + +body { + font-family: Helvetica, Arial, sans-serif; + font-size: 0.9em; + margin-bottom: 15px; + padding-left: 60px; + padding-right: 60px; +} + +a { color: #0f388f; cursor:pointer; } + +h1.title { + font-size: 3.5em; + font-weight: bold; + color: #000; + position: relative; + display: inline; + cursor: pointer; +} + +h1.title:before { + content: attr(title); + position: absolute; + color: rgba(255,255,255,0.15); + top: 1px; + left: 1px; + cursor: pointer; +} + +h2.title { + color: #000; + font-size: 1em; + display: inline; + font-style: italic; + font-weight: bold; + position: relative; + bottom: 8px; +} + +h3.title { + color: #94a3b4; + font-size: 0.7em; + display: inline; + margin-top: 10px; + position: relative; + bottom: 8px; +} + +#aboutbox { + color: #94a3b4; + padding: 4px 8px 4px 16px; + position: relative; + top: 10px; + border-left: 2px solid #94a3b4; + float: right; + width: 60%; +} + +#aboutbox a { color: #94a3b4; } + +#message, #cleartext, #prettymessage, #attachment, .replymessage { + clear: both; + color: #000; + background-color: #fff; + font-size: 9pt; + border: 1px solid #28343F; + box-sizing: border-box; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + -o-box-sizing: border-box; + width: 100%; +} + +#message, .replymessage { + padding: 5px; + white-space: pre-wrap; + font-family: Consolas, "Lucida Console", "DejaVu Sans Mono", Monaco, monospace; + resize: vertical; +} + +#attachmentPreview img { + max-width: 100%; + height: auto; +} + +#attachmentPreview .pdfPreview { + width: 100%; + height: 100vh; + margin-bottom: 20px; +} + +#dropzone { + text-align: center; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 1000; + opacity: 0.6; + background-color: #99ccff; + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath d='M0 0h24v24H0z' fill='none'/%3E%3Cpath d='M19.35 10.04C18.67 6.59 15.64 4 12 4 9.11 4 6.6 5.64 5.35 8.04 2.34 8.36 0 10.91 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zM14 13v4h-4v-4H7l5-5 5 5h-3z'/%3E%3C/svg%3E"); + background-repeat: no-repeat; + background-position: center; + background-size: 25vh; + outline: 2px dashed #228bff; + outline-offset: -50px; +} + +.dragAndDropFile{ + color: #777; + font-size: 1em; + display: inline; + white-space: normal; +} + +#status { + clear: both; + padding: 5px 10px; +} + +#pasteresult { + background-color: #1F2833; + color: #fff; + padding: 4px 12px; + clear: both; + -moz-box-shadow: inset 0 2px 2px #000; + -webkit-box-shadow: inset 0 2px 2px #000; + box-shadow: inset 0 2px 2px #000; +} + +#pasteresult a { color: #fff; } + +#pasteresult button { margin-left: 11px; } + +#deletelink { float: right; } + +#toolbar, #status { margin-bottom: 5px; } + +#copyhint { color: #666; font-size: 0.85em } + +button, .button { + color: #fff; + background-color: #323b47; + background-repeat: no-repeat; + background-position: center left; + padding: 4px 8px; + font-size: 1em; + margin-right: 5px; + display: inline-block; + background-image: linear-gradient(bottom, #323b47 0, #51606e 100%); + background-image: -o-linear-gradient(bottom, #323b47 0, #51606e 100%); + background-image: -moz-linear-gradient(bottom, #323b47 0, #51606e 100%); + background-image: -webkit-linear-gradient(bottom, #323b47 0, #51606e 100%); + background-image: -ms-linear-gradient(bottom, #323b47 0, #51606e 100%); + background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #323b47), color-stop(1, #51606e)); + border: 1px solid #28343F; + -moz-box-shadow: inset 0 1px 2px #647384; + -webkit-box-shadow: inset 0 1px 2px #647384; + box-shadow: inset 0 1px 2px #647384; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + -moz-background-clip: padding; + -webkit-background-clip: padding-box; + background-clip: padding-box; +} + +button:hover { + background-image: linear-gradient(bottom, #424b57 0%, #61707e 100%); + background-image: -o-linear-gradient(bottom, #424b57 0%, #61707e 100%); + background-image: -moz-linear-gradient(bottom, #424b57 0%, #61707e 100%); + background-image: -webkit-linear-gradient(bottom, #424b57 0%, #61707e 100%); + background-image: -ms-linear-gradient(bottom, #424b57 0%, #61707e 100%); + background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #424b57), color-stop(1, #61707e)); +} + +button:active { + background-image: linear-gradient(bottom, #51606e 0, #323b47 100%); + background-image: -o-linear-gradient(bottom, #51606e 0, #323b47 100%); + background-image: -moz-linear-gradient(bottom, #51606e 0, #323b47 100%); + background-image: -webkit-linear-gradient(bottom, #51606e 0, #323b47 100%); + background-image: -ms-linear-gradient(bottom, #51606e 0, #323b47 100%); + background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #51606e), color-stop(1, #323b47)); + position:relative; + top:1px; +} + +button:disabled, .buttondisabled { + background: #ccc; + color: #888; + top: 0; +} + +button img { + margin-right: 8px; + position: relative; + top: 2px; +} + +.button { + background-color: #414d5a; + padding: 6px 8px; + margin: 0 5px 0 0; + position: relative; + bottom: 1px; /* WTF ? Why is this shifted by 1 pixel ? */ +} + +.button select { + color: #eee; + background: transparent; + border: none; +} + + +.button select option { + color:#eee; + background: #414d5a; +} + +#rawtextbutton img { + padding: 1px 0 1px 0; +} + +#remainingtime, #password { + color: #94a3b4; + display: inline; + font-size: 0.85em; +} + +#newbutton { + float: right; + margin-right: 0; + margin-bottom: 5px; + display: inline; +} + +input { + color: #777; + font-size: 1em; + padding: 6px; + border: 1px solid #28343f; +} + +.blink { + text-decoration: blink; + font-size: 0.8em; + color: #a4b3c4; +} + +.foryoureyesonly { + color: #ff0 !important; + font-size: 1em !important; + font-weight: bold !important; +} + +#attachmentPreview, .nonworking { + background-color: #fff; + color: #000; + width: 100%; + text-align: center; + font-weight: bold; + font-size: 10pt; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + padding: 5px 0; +} + +.hidden { display: none !important; } + +#ienotice { + background-color: #7e98af; + color: #000; + font-size: 0.85em; + padding: 3px 5px; + text-align: center; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + display: none; +} + +#ienotice a { color: #000; } + +#oldnotice, #httpnotice { display: none; } + +#errormessage, .errorMessage { + background-color: #f77 !important; + color:#ff0; +} + +.small { + font-size: 80%; +} + +/* --- discussion related CSS ------- */ + +#discussion { /* Discussion container */ + margin-top: 20px; + width: 100%; + margin-left: -30px; + min-width: 200px; +} + +h4.title { + font-size: 1.2em; + color: #94a3b4; + font-style: italic; + font-weight: bold; + position: relative; + margin-left: 30px; +} + +.comment /* One single reply */ +{ + background-color: #ceced6; + color: #000; + white-space: pre-wrap; + font-family: Consolas,"Lucida Console","DejaVu Sans Mono",Monaco,monospace; + font-size: 9pt; + border-left: 1px solid #859AAE; + border-top: 1px solid #859AAE; + padding: 5px 0px 5px 5px; + margin-left: 30px; + -moz-box-shadow: -3px -3px 5px rgba(0,0,0,0.15); + -webkit-box-shadow: -3px -3px 5px rgba(0,0,0,0.15); + box-shadow: -3px -3px 5px rgba(0,0,0,0.15); + min-width: 200px; + overflow: auto; +} + +.reply { margin: 5px 0 0 30px; } + +#replystatus { + display: inline; + padding: 1px 7px; + font-family: Arial, Helvetica, sans-serif; +} + +.comment button { + color: #446; + background-color: #aab; + background-repeat: no-repeat; + background-position: center left; + padding: 0 2px; + font-size: 0.73em; + margin: 3px 5px 3px 0; + display: inline; + background-image: linear-gradient(bottom, #aab 0, #ccc 100%); + background-image: -o-linear-gradient(bottom, #aab 0, #ccc 100%); + background-image: -moz-linear-gradient(bottom, #aab 0, #ccc 100%); + background-image: -webkit-linear-gradient(bottom, #aab 0, #ccc 100%); + background-image: -ms-linear-gradient(bottom, #aab 0, #ccc 100%); + background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #aab), color-stop(1, #ccc)); + border: 1px solid #ccd; + -moz-box-shadow: inset 0 1px 2px #ddd; + -webkit-box-shadow: inset 0 1px 2px #fff; + box-shadow: inset 0 1px 2px #eee; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + -moz-background-clip: padding; + -webkit-background-clip: padding-box; + background-clip: padding-box; +} + +.comment button:hover { + background-image: linear-gradient(bottom, #ccd 0, #fff 100%); + background-image: -o-linear-gradient(bottom, #ccd 0, #fff 100%); + background-image: -moz-linear-gradient(bottom, #ccd 0, #fff 100%); + background-image: -webkit-linear-gradient(bottom, #ccd 0, #fff 100%); + background-image: -ms-linear-gradient(bottom, #ccd 0, #fff 100%); + background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #ccd), color-stop(1, #fff)); +} + +.comment button:active { + background-image: linear-gradient(bottom, #fff 0, #889 100%); + background-image: -o-linear-gradient(bottom, #fff 0, #889 100%); + background-image: -moz-linear-gradient(bottom, #fff 0, #889 100%); + background-image: -webkit-linear-gradient(bottom, #fff 0, #889 100%); + background-image: -ms-linear-gradient(bottom, #fff 0, #889 100%); + background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #fff), color-stop(1, #889)); + position:relative; + top:1px; +} + +.comment input { padding: 2px; } + +#replymessage { margin-top: 5px; } + +.commentmeta { + color: #fff; + background-color: #8ea0b2; + margin-bottom: 3px; + padding: 0 0 0 3px; +} + +.commentdate { color: #bfcede; } + +#filewrap { + transition: background-color 0.75s ease-out; +} + +.highlight { + background-color: #ffdd86; + transition: background-color 0.2s ease-in; +} + +img.vizhash { + width: 16px; + height: 16px; + position: relative; + top: 2px; + left: -3px; +} + +#prettyprint { + color: #000000; + font-size: 1.2em; +} + +#prettyprint.prettyprinted { + overflow: auto; +} + +#cleartext { + padding: 10px; +} + +#cleartext * { + margin-bottom: 10px; +} + +#cleartext ol { + list-style: auto; + margin-left: 15px; +} + +#cleartext ul { + list-style: disc; + margin-left: 15px; +} + +#cleartext h1, #cleartext h2, #cleartext h3, #cleartext h4, #cleartext h5, #cleartext h6 { + font-weight: bold; +} + +#cleartext h1 { + font-size: 2em; +} + +#cleartext h2 { + font-size: 1.5em; +} + +#cleartext h3 { + font-size: 1.2em; +} diff --git a/i18n/bg.json b/i18n/bg.json new file mode 100644 index 00000000..63666060 --- /dev/null +++ b/i18n/bg.json @@ -0,0 +1,172 @@ +{ + "PrivateBin": "PrivateBin", + "%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted in the browser using 256 bits AES. More information on the project page.": + "%s е изчистен и изцяло достъпен като отворен код, онлайн \"paste\" услуга, където сървъра не знае подадената информация. Тя се шифрова/дешифрова във браузъра използвайки 256 битов AES алгоритъм. Повече информация може да намерите на страницата на проекта (Английски)", + "Because ignorance is bliss": + "Невежеството е блаженство", + "en": "bg", + "Paste does not exist, has expired or has been deleted.": + "Информацията не съществува, срокът и е изтекъл или е била изтрита.", + "%s requires php %s or above to work. Sorry.": + "%s има нужда от PHP %s или по-нова, за да работи. Съжалявам.", + "%s requires configuration section [%s] to be present in configuration file.": + "%s задължава отдела от настройките [%s] да съществува във файла със настройките.", + "Please wait %d seconds between each post.": + "Моля изчакайте %d секунди между всяка публикация.", + "Paste is limited to %s of encrypted data.": + "Съдържанието е ограничено до %s криптирана информация.", + "Invalid data.": + "Невалидна информация.", + "You are unlucky. Try again.": + "Нямаш късмет. Пробвай отново.", + "Error saving comment. Sorry.": + "Грешка в запазването на коментара. Съжалявам.", + "Error saving paste. Sorry.": + "Грешка в записването на информацията. Съжалявам.", + "Invalid paste ID.": + "Невалиден идентификационен код.", + "Paste is not of burn-after-reading type.": + "Информацията не е от тип \"унищожаване след преглед\".", + "Wrong deletion token. Paste was not deleted.": + "Невалиден код за изтриване. Информацията Ви не беше изтрита.", + "Paste was properly deleted.": + "Информацията Ви е изтрита.", + "JavaScript is required for %s to work.
Sorry for the inconvenience.": + "Услугата %s се нуждае от JavaScript, за да работи.
Съжаляваме за неудобството.", + "%s requires a modern browser to work.": + "%s се нуждае от съвременен браузър за да работи.", + "New": + "Създаване", + "Send": + "Изпрати", + "Clone": + "Дублирай", + "Raw text": + "Чист текст", + "Expires": + "Изтича", + "Burn after reading": + "Унищожи след преглед", + "Open discussion": + "Отворена дискусия", + "Password (recommended)": + "Парола (препоръчва се)", + "Discussion": + "Коментари", + "Toggle navigation": + "Включи или Изключи навигацията", + "%d seconds": ["%d секунди", "%d секунда"], + "%d minutes": ["%d минути", "%d минута"], + "%d hours": ["%d часа", "%d час"], + "%d days": ["%d дни", "%d ден"], + "%d weeks": ["%d седмици", "%d седмица"], + "%d months": ["%d месеци", "%d месец"], + "%d years": ["%d години", "%d година"], + "Never": + "Никога", + "Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": + "Забележка: Това е пробна услуга: Информацията може да бъде изтрита по всяко време. Котета ще измрат ако злоупотребиш с услугата.", + "This document will expire in %d seconds.": + ["Този документ изтича след една секунда.", "Този документ изтича след %d секунди."], + "This document will expire in %d minutes.": + ["Този документ изтича след една минута.", "Този документ изтича след %d минути."], + "This document will expire in %d hours.": + ["Този документ изтича след един час.", "Този документ изтича след %d часа."], + "This document will expire in %d days.": + ["Този документ изтича след един ден.", "Този документ изтича след %d дни."], + "This document will expire in %d months.": + ["Този документ изтича след една година.", "Този документ изтича след %d години."], + "Please enter the password for this paste:": + "Моля въведете паролата за това съдържание:", + "Could not decrypt data (Wrong key?)": + "Информацията не можеше да се дешифрова (Грешен ключ?)", + "Could not delete the paste, it was not stored in burn after reading mode.": + "Изтриването на информацията беше неуспешно. Тя не е от тип \"унищожаване след преглед\".", + "FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": + "САМО ЗА ВАШИТЕ ОЧИ. Не затваряйте прозореца, понеже тази информация няма да може да бъде показана отново.", + "Could not decrypt comment; Wrong key?": + "Дешифроването на коментара беше неуспешно. Грешен ключ?", + "Reply": + "Отговор", + "Anonymous": + "Безименен", + "Avatar generated from IP address": + "Аватар (на базата на IP адреса Ви)", + "Add comment": + "Добави коментар", + "Optional nickname…": + "Избирателен псевдоним", + "Post comment": + "Публикувай коментара", + "Sending comment…": + "Изпращане на коментара Ви…", + "Comment posted.": + "Коментара Ви е публикуван.", + "Could not refresh display: %s": + "Презареждането на екрана беше неуспешно: %s", + "unknown status": + "Неизвестно състояние", + "server error or not responding": + "Грешка в сървъра или не отговаря", + "Could not post comment: %s": + "Публикуването на коментара Ви беше неуспешно: %s", + "Sending paste…": + "Изпращане на информацията Ви…", + "Your paste is %s (Hit [Ctrl]+[c] to copy)": + "Вашата връзка е %s (Натиснете [Ctrl]+[c] за да копирате)", + "Delete data": + "Изтриване на информацията", + "Could not create paste: %s": + "Създаването на връзката ви беше неуспешно: %s", + "Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": + "Дешифроването на информацията беше неуспешно: Ключа за декриптиране липсва във връзката (Да не сте използвали услуга за пренасочване или скъсяване на връзката, което би изрязало части от нея?)", + "Format": "Format", + "Plain Text": "Чист текст", + "Source Code": "Изходен код", + "Markdown": "Markdown", + "Download attachment": "Свали прикачения файл", + "Cloned: '%s'": "Дублирано: '%s'", + "The cloned file '%s' was attached to this paste.": "Дублирания файл '%s' беше прикачен.", + "Attach a file": "Прикачи файл", + "alternatively drag & drop a file or paste an image from the clipboard": "Също можеш да пуснеш файла върху този прозорец или да поставиш изображение от клипборда", + "File too large, to display a preview. Please download the attachment.": "Файла е твърде голям, за да се представи визуализация. Моля, свалете файла.", + "Remove attachment": "Премахнете файла", + "Your browser does not support uploading encrypted files. Please use a newer browser.": + "Браузърът ви не поддържа прикачване на шифровани файлове. Моля, използвайте по-нов браузър", + "Invalid attachment.": "Невалидно прикачване.", + "Options": "Настройки", + "Shorten URL": "Скъси връзката", + "Editor": "Редактор", + "Preview": "Визуализация", + "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": + "PATH трябва да е във края на \"%s\" за да може %s да работи правилно. Моля обновете PATH във вашият index.php .", + "Decrypt": + "Дешифровай", + "Enter password": + "Въведи паролата", + "Loading…": "Зареждане…", + "Decrypting paste…": "Дешифроване на информацията…", + "Preparing new paste…": "Приготвяне на връзката Ви…", + "In case this message never disappears please have a look at this FAQ for information to troubleshoot.": + "Във случай, че това съобщение не изчезне след време, моля прегледайте този FAQ (Английски), за информация, която би ви помогнала.", + "+++ no paste text +++": "+++ няма текстово съдържание +++", + "Could not get paste data: %s": + "Взимането на информацията беше неуспешно: %s", + "QR code": "QR код", + "This website is using an insecure HTTP connection! Please use it only for testing.": + "Този сайт използва несигурна HTTP връзка. Моля използвайте само за проби.", + "For more information see this FAQ entry.": + "Вижте тази страница за повече информация.", + "Your browser may require an HTTPS connection to support the WebCrypto API. Try switching to HTTPS.": + "Браузъра ви може да се нуждае от HTTPS връзка за да използва WebCrypto API. Пробвай да минеш на HTTPS.", + "Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.": + "Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.", + "waiting on user to provide a password": + "waiting on user to provide a password", + "Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.": + "Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.", + "Retry": + "Retry", + "Showing raw text…": + "Showing raw text…" +} diff --git a/i18n/cs.json b/i18n/cs.json new file mode 100644 index 00000000..02b599d7 --- /dev/null +++ b/i18n/cs.json @@ -0,0 +1,172 @@ +{ + "PrivateBin": "PrivateBin", + "%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted in the browser using 256 bits AES. More information on the project page.": + "%s je minimalistický open source 'pastebin' server, který neanalyzuje vložená data. Data jsou šifrována v prohlížeči pomocí 256 bitů AES. Více informací na stránce projetu.", + "Because ignorance is bliss": + "Protože nevědomost je sladká", + "en": "cs", + "Paste does not exist, has expired or has been deleted.": + "Vložený text neexistuje, expiroval nebo byl odstraněn.", + "%s requires php %s or above to work. Sorry.": + "%s vyžaduje php %s nebo vyšší. Lituji.", + "%s requires configuration section [%s] to be present in configuration file.": + "%s requires configuration section [%s] to be present in configuration file.", + "Please wait %d seconds between each post.": + "Počet sekund do dalšího příspěvku: %d.", + "Paste is limited to %s of encrypted data.": + "Příspěvek je limitován na %s šífrovaných dat", + "Invalid data.": + "Chybná data.", + "You are unlucky. Try again.": + "Lituji, zkuste to znovu.", + "Error saving comment. Sorry.": + "Chyba při ukládání komentáře.", + "Error saving paste. Sorry.": + "Chyba při ukládání příspěvku.", + "Invalid paste ID.": + "Chybně vložené ID.", + "Paste is not of burn-after-reading type.": + "Paste is not of burn-after-reading type.", + "Wrong deletion token. Paste was not deleted.": + "Wrong deletion token. Paste was not deleted.", + "Paste was properly deleted.": + "Paste was properly deleted.", + "JavaScript is required for %s to work.
Sorry for the inconvenience.": + "JavaScript is required for %s to work.
Sorry for the inconvenience.", + "%s requires a modern browser to work.": + "%%s requires a modern browser to work.", + "New": + "Nový", + "Send": + "Odeslat", + "Clone": + "Klonovat", + "Raw text": + "Pouze Text", + "Expires": + "Expirace", + "Burn after reading": + "Po přečtení smazat", + "Open discussion": + "Povolit komentáře", + "Password (recommended)": + "Heslo (doporučeno)", + "Discussion": + "Komentáře", + "Toggle navigation": + "Toggle navigation", + "%d seconds": ["%d sekuda", "%d sekundy", "%d sekund"], + "%d minutes": ["%d minuta", "%d minuty", "%d minut"], + "%d hours": ["%d hodin", "%d hodiny", "%d hodin"], + "%d days": ["%d den", "%d dny", "%d dní"], + "%d weeks": ["%d týden", "%d týdeny", "%d týdnů"], + "%d months": ["%d měsíc", "%d měsíce", "%d měsíců"], + "%d years": ["%d rok", "%d roky", "%d roků"], + "Never": + "Nikdy", + "Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": + "Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.", + "This document will expire in %d seconds.": + ["Tento dokument expiruje za %d sekundu.", "Tento dokument expiruje za %d sekundy.", "Tento dokument expiruje za %d sekund."], + "This document will expire in %d minutes.": + ["Tento dokument expiruje za %d minutu.", "Tento dokument expiruje za %d minuty.", "Tento dokument expiruje za %d minut."], + "This document will expire in %d hours.": + ["Tento dokument expiruje za %d hodinu.", "Tento dokument expiruje za %d hodiny.", "Tento dokument expiruje za %d hodin."], + "This document will expire in %d days.": + ["Tento dokument expiruje za %d den.", "Tento dokument expiruje za %d dny.", "Tento dokument expiruje za %d dny."], + "This document will expire in %d months.": + ["Tento dokument expiruje za %d měsíc.", "Tento dokument expiruje za %d měsíce.", "Tento dokument expiruje za %d měsíců."], + "Please enter the password for this paste:": + "Zadejte prosím heslo:", + "Could not decrypt data (Wrong key?)": + "Could not decrypt data (Wrong key?)", + "Could not delete the paste, it was not stored in burn after reading mode.": + "Could not delete the paste, it was not stored in burn after reading mode.", + "FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": + "FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.", + "Could not decrypt comment; Wrong key?": + "Could not decrypt comment; Wrong key?", + "Reply": + "Reply", + "Anonymous": + "Anonym", + "Avatar generated from IP address": + "Avatar generated from IP address", + "Add comment": + "Přidat komentář", + "Optional nickname…": + "Volitelný nickname…", + "Post comment": + "Odeslat komentář", + "Sending comment…": + "Odesílání komentáře…", + "Comment posted.": + "Komentář odeslán.", + "Could not refresh display: %s": + "Could not refresh display: %s", + "unknown status": + "neznámý stav", + "server error or not responding": + "Chyba na serveru nebo server neodpovídá", + "Could not post comment: %s": + "Nelze odeslat komentář: %s", + "Sending paste…": + "Odesílání příspěvku…", + "Your paste is %s (Hit [Ctrl]+[c] to copy)": + "Váš link je %s (Stiskněte [Ctrl]+[c] pro zkopírování)", + "Delete data": + "Odstranit data", + "Could not create paste: %s": + "Nelze vytvořit příspěvek: %s", + "Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": + "Nepodařilo se dešifrovat příspěvek: V adrese chybí dešifrovací klíč (Možnou příčinou může být URL shortener?)", + "Format": "Formát", + "Plain Text": "Prostý Text", + "Source Code": "Zdrojový kód", + "Markdown": "Markdown", + "Download attachment": "Stáhnout přílohu", + "Cloned: '%s'": "Klonováno: '%s'", + "The cloned file '%s' was attached to this paste.": "The cloned file '%s' was attached to this paste.", + "Attach a file": "Připojit soubor", + "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", + "File too large, to display a preview. Please download the attachment.": "Soubor je příliš velký pro zobrazení náhledu. Stáhněte si přílohu.", + "Remove attachment": "Odstranit přílohu", + "Your browser does not support uploading encrypted files. Please use a newer browser.": + "Váš prohlížeč nepodporuje nahrávání šifrovaných souborů. Použijte modernější verzi prohlížeče.", + "Invalid attachment.": "Chybná příloha.", + "Options": "Volby", + "Shorten URL": "Shorten URL", + "Editor": "Editor", + "Preview": "Náhled", + "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": + "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.", + "Decrypt": + "Decrypt", + "Enter password": + "Zadejte heslo", + "Loading…": "Loading…", + "Decrypting paste…": "Decrypting paste…", + "Preparing new paste…": "Preparing new paste…", + "In case this message never disappears please have a look at this FAQ for information to troubleshoot.": + "In case this message never disappears please have a look at this FAQ for information to troubleshoot.", + "+++ no paste text +++": "+++ žádný vložený text +++", + "Could not get paste data: %s": + "Could not get paste data: %s", + "QR code": "QR code", + "This website is using an insecure HTTP connection! Please use it only for testing.": + "This website is using an insecure HTTP connection! Please use it only for testing.", + "For more information see this FAQ entry.": + "For more information see this FAQ entry.", + "Your browser may require an HTTPS connection to support the WebCrypto API. Try switching to HTTPS.": + "Your browser may require an HTTPS connection to support the WebCrypto API. Try switching to HTTPS.", + "Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.": + "Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.", + "waiting on user to provide a password": + "waiting on user to provide a password", + "Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.": + "Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.", + "Retry": + "Retry", + "Showing raw text…": + "Showing raw text…" +} diff --git a/i18n/de.json b/i18n/de.json new file mode 100644 index 00000000..1d6678ab --- /dev/null +++ b/i18n/de.json @@ -0,0 +1,172 @@ +{ + "PrivateBin": "PrivateBin", + "%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted in the browser using 256 bits AES. More information on the project page.": + "%s ist ein minimalistischer, quelloffener \"Pastebin\"-artiger Dienst, bei dem der Server keinerlei Kenntnis der Inhalte hat. Die Daten werden im Browser mit 256 Bit AES ver- und entschlüsselt. Weitere Informationen sind auf der Projektseite zu finden.", + "Because ignorance is bliss": + "Unwissenheit ist ein Segen", + "en": "de", + "Paste does not exist, has expired or has been deleted.": + "Diesen Text gibt es nicht, er ist abgelaufen oder wurde gelöscht.", + "%s requires php %s or above to work. Sorry.": + "%s benötigt PHP %s oder höher, um zu funktionieren. Sorry.", + "%s requires configuration section [%s] to be present in configuration file.": + "%s benötigt den Konfigurationsabschnitt [%s] in der Konfigurationsdatei um zu funktionieren.", + "Please wait %d seconds between each post.": + "Bitte warte %d Sekunden zwischen dem Absenden.", + "Paste is limited to %s of encrypted data.": + "Texte sind auf %s verschlüsselte Datenmenge beschränkt.", + "Invalid data.": + "Ungültige Daten.", + "You are unlucky. Try again.": + "Du hast Pech. Versuchs nochmal.", + "Error saving comment. Sorry.": + "Fehler beim Speichern des Kommentars. Sorry.", + "Error saving paste. Sorry.": + "Fehler beim Speichern des Textes. Sorry.", + "Invalid paste ID.": + "Ungültige Text-ID.", + "Paste is not of burn-after-reading type.": + "Text ist kein \"Einmal\"-Typ.", + "Wrong deletion token. Paste was not deleted.": + "Falscher Lösch-Code. Text wurde nicht gelöscht.", + "Paste was properly deleted.": + "Text wurde erfolgreich gelöscht.", + "JavaScript is required for %s to work.
Sorry for the inconvenience.": + "JavaScript ist eine Voraussetzung, um %s zu nutzen.
Bitte entschuldige die Unannehmlichkeiten.", + "%s requires a modern browser to work.": + "%s setzt einen modernen Browser voraus, um funktionieren zu können.", + "New": + "Neu", + "Send": + "Senden", + "Clone": + "Klonen", + "Raw text": + "Reiner Text", + "Expires": + "Ablaufzeit", + "Burn after reading": + "Nach dem Lesen löschen", + "Open discussion": + "Kommentare aktivieren", + "Password (recommended)": + "Passwort (empfohlen)", + "Discussion": + "Kommentare", + "Toggle navigation": + "Navigation umschalten", + "%d seconds": ["%d Sekunde", "%d Sekunden"], + "%d minutes": ["%d Minute", "%d Minuten"], + "%d hours": ["%d Stunde", "%d Stunden"], + "%d days": ["%d Tag", "%d Tage"], + "%d weeks": ["%d Woche", "%d Wochen"], + "%d months": ["%d Monat", "%d Monate"], + "%d years": ["%d Jahr", "%d Jahre"], + "Never": + "Nie", + "Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": + "Hinweis: Dies ist ein Versuchsdienst. Daten können jederzeit gelöscht werden. Kätzchen werden sterben wenn du diesen Dienst missbrauchst.", + "This document will expire in %d seconds.": + ["Dieses Dokument läuft in einer Sekunde ab.", "Dieses Dokument läuft in %d Sekunden ab."], + "This document will expire in %d minutes.": + ["Dieses Dokument läuft in einer Minute ab.", "Dieses Dokument läuft in %d Minuten ab."], + "This document will expire in %d hours.": + ["Dieses Dokument läuft in einer Stunde ab.", "Dieses Dokument läuft in %d Stunden ab."], + "This document will expire in %d days.": + ["Dieses Dokument läuft in einem Tag ab.", "Dieses Dokument läuft in %d Tagen ab."], + "This document will expire in %d months.": + ["Dieses Dokument läuft in einem Monat ab.", "Dieses Dokument läuft in %d Monaten ab."], + "Please enter the password for this paste:": + "Bitte gib das Passwort für diesen Text ein:", + "Could not decrypt data (Wrong key?)": + "Konnte Daten nicht entschlüsseln (Falscher Schlüssel?)", + "Could not delete the paste, it was not stored in burn after reading mode.": + "Konnte das Paste nicht löschen, es wurde nicht im Einmal-Modus gespeichert.", + "FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": + "DIESER TEXT IST NUR FÜR DICH GEDACHT. Schließe das Fenster nicht, diese Nachricht kann nur einmal geöffnet werden.", + "Could not decrypt comment; Wrong key?": + "Konnte Kommentar nicht entschlüsseln; Falscher Schlüssel?", + "Reply": + "Antworten", + "Anonymous": + "Anonym", + "Avatar generated from IP address": + "Avatar (generiert aus der IP-Adresse)", + "Add comment": + "Kommentar hinzufügen", + "Optional nickname…": + "Optionales Pseudonym…", + "Post comment": + "Kommentar absenden", + "Sending comment…": + "Sende Kommentar…", + "Comment posted.": + "Kommentar gesendet.", + "Could not refresh display: %s": + "Ansicht konnte nicht aktualisiert werden: %s", + "unknown status": + "Unbekannter Grund", + "server error or not responding": + "Fehler auf dem Server oder keine Antwort vom Server", + "Could not post comment: %s": + "Konnte Kommentar nicht senden: %s", + "Sending paste…": + "Sende Paste…", + "Your paste is %s (Hit [Ctrl]+[c] to copy)": + "Dein Text ist unter %s zu finden (Drücke [Strg]+[c] um den Link zu kopieren)", + "Delete data": + "Lösche Daten", + "Could not create paste: %s": + "Text konnte nicht erstellt werden: %s", + "Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": + "Konnte Paste nicht entschlüsseln: Der Schlüssel fehlt in der Adresse (Hast du eine Umleitung oder einen URL-Verkürzer benutzt, der Teile der Adresse entfernt?)", + "Format": "Format", + "Plain Text": "Nur Text", + "Source Code": "Quellcode", + "Markdown": "Markdown", + "Download attachment": "Anhang herunterladen", + "Cloned: '%s'": "Geklont: '%s'", + "The cloned file '%s' was attached to this paste.": "Die geklonte Datei '%s' wurde angehängt.", + "Attach a file": "Datei anhängen", + "alternatively drag & drop a file or paste an image from the clipboard": "Alternativ Drag & Drop einer Datei oder einfügen eines Bildes aus der Zwischenablage", + "File too large, to display a preview. Please download the attachment.": "Datei zu groß, um als Vorschau angezeigt zu werden. Bitte Anhang herunterladen.", + "Remove attachment": "Anhang entfernen", + "Your browser does not support uploading encrypted files. Please use a newer browser.": + "Dein Browser unterstützt das hochladen von verschlüsselten Dateien nicht. Bitte verwende einen neueren Browser.", + "Invalid attachment.": "Ungültiger Datei-Anhang.", + "Options": "Optionen", + "Shorten URL": "URL verkürzen", + "Editor": "Bearbeiten", + "Preview": "Vorschau", + "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": + "Der PATH muss bei %s mit einem \"%s\" enden. Bitte passe Deinen PATH in Deiner index.php an.", + "Decrypt": + "Entschlüsseln", + "Enter password": + "Passwort eingeben", + "Loading…": "Lädt…", + "Decrypting paste…": "Entschlüssle Text…", + "Preparing new paste…": "Bereite neuen Text vor…", + "In case this message never disappears please have a look at this FAQ for information to troubleshoot.": + "Wenn diese Nachricht nicht mehr verschwindet, schau bitte in die FAQ (englisch), um zu sehen, wie der Fehler behoben werden kann.", + "+++ no paste text +++": "+++ kein Paste-Text +++", + "Could not get paste data: %s": + "Text konnte nicht geladen werden: %s", + "QR code": "QR code", + "This website is using an insecure HTTP connection! Please use it only for testing.": + "Diese Webseite verwendet eine unsichere HTTP Verbindung! Bitte benutze sie nur zum Testen.", + "For more information see this FAQ entry.": + "Besuche diesen FAQ Eintrag für weitere Informationen dazu.", + "Your browser may require an HTTPS connection to support the WebCrypto API. Try switching to HTTPS.": + "Dein Browser benötigt möglicherweise eine HTTPS Verbindung um das WebCrypto API nutzen zu können. Versuche auf HTTPS zu wechseln.", + "Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.": + "Dein Browser unterstützt WebAssembly nicht, welches für zlib Komprimierung benötigt wird. Du kannst unkomprimierte Dokumente erzeugen, aber keine komprimierten lesen.", + "waiting on user to provide a password": + "warte auf Passworteingabe durch Benutzer", + "Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.": + "Konnte Daten nicht entschlüsseln. Hast Du das falsche Passwort eingegeben? Wiederhole den Vorgang mit dem oben stehenden Knopf.", + "Retry": + "Wiederholen", + "Showing raw text…": + "Zeige reinen Text an…" +} diff --git a/i18n/es.json b/i18n/es.json new file mode 100644 index 00000000..564dd72e --- /dev/null +++ b/i18n/es.json @@ -0,0 +1,172 @@ +{ + "PrivateBin": "PrivateBin", + "%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted in the browser using 256 bits AES. More information on the project page.": + "%s es un \"pastebin\" en línea minimalista de código abierto, donde el servidor no tiene ningún conocimiento de los datos guardados. Los datos son cifrados/descifrados en el navegador usando 256 bits AES. Más información en la página del proyecto.", + "Because ignorance is bliss": + "Porque la ignorancia es dicha", + "en": "es", + "Paste does not exist, has expired or has been deleted.": + "El \"paste\" no existe, ha caducado o ha sido eliminado.", + "%s requires php %s or above to work. Sorry.": + "%s requiere php %s o superior para funcionar. Lo siento.", + "%s requires configuration section [%s] to be present in configuration file.": + "%s requiere que la sección de configuración [%s] esté presente en el archivo de configuración.", + "Please wait %d seconds between each post.": + "Por favor espere %d segundos entre cada publicación.", + "Paste is limited to %s of encrypted data.": + "El \"paste\" está limitado a %s de datos cifrados.", + "Invalid data.": + "Datos inválidos.", + "You are unlucky. Try again.": + "Tienes mala suerte. Inténtalo de nuevo", + "Error saving comment. Sorry.": + "Error al guardar el comentario. Lo siento.", + "Error saving paste. Sorry.": + "Error al guardar el \"paste\". Lo siento", + "Invalid paste ID.": + "ID del \"paste\" inválido.", + "Paste is not of burn-after-reading type.": + "El \"paste\" no es del tipo \"destruir despues de leer\".", + "Wrong deletion token. Paste was not deleted.": + "Token de eliminación erróneo. El \"paste\" no fue eliminado.", + "Paste was properly deleted.": + "El \"paste\" se ha eliminado correctamente.", + "JavaScript is required for %s to work.
Sorry for the inconvenience.": + "JavaScript es necesario para que %s funcione.
Sentimos los inconvenientes ocasionados.", + "%s requires a modern browser to work.": + "%s requiere un navegador moderno para funcionar.", + "New": + "Nuevo", + "Send": + "Enviar", + "Clone": + "Clonar", + "Raw text": + "Texto sin formato", + "Expires": + "Caducar en", + "Burn after reading": + "Destruir después de leer", + "Open discussion": + "Discusión abierta", + "Password (recommended)": + "Contraseña (recomendado)", + "Discussion": + "Discusión", + "Toggle navigation": + "Cambiar navegación", + "%d seconds": ["%d segundo", "%d segundos"], + "%d minutes": ["%d minuto", "%d minutos"], + "%d hours": ["%d hora", "%d horas"], + "%d days": ["%d día", "%d días"], + "%d weeks": ["%d semana", "%d semanas"], + "%d months": ["%d mes", "%d meses"], + "%d years": ["%d año", "%d años"], + "Never": + "Nunca", + "Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": + "Nota: Este es un servicio de prueba. Los datos pueden ser eliminados en cualquier momento. Morirán gatitos si abusas de este servicio.", + "This document will expire in %d seconds.": + ["Este documento caducará en un segundo.", "Este documento caducará en %d segundos."], + "This document will expire in %d minutes.": + ["Este documento caducará en un minuto.", "Este documento caducará en %d minutos."], + "This document will expire in %d hours.": + ["Este documento caducará en una hora.", "Este documento caducará en %d horas."], + "This document will expire in %d days.": + ["Este documento caducará en un día.", "Este documento caducará en %d días."], + "This document will expire in %d months.": + ["Este documento caducará en un mes.", "Este documento caducará en %d meses."], + "Please enter the password for this paste:": + "Por favor ingrese la contraseña para este \"paste\":", + "Could not decrypt data (Wrong key?)": + "No fue posible descifrar los datos (¿Clave errónea?)", + "Could not delete the paste, it was not stored in burn after reading mode.": + "No fue posible eliminar el documento, no fue guardado en modo \"destruir despues de leer\".", + "FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": + "SÓLO PARA TUS OJOS. No cierres esta ventana, este mensaje no se puede volver a mostrar.", + "Could not decrypt comment; Wrong key?": + "No se pudo descifrar el comentario; ¿Llave incorrecta?", + "Reply": + "Responder", + "Anonymous": + "Anónimo", + "Avatar generated from IP address": + "Avatar generado a partir de la dirección IP", + "Add comment": + "Añadir comentario", + "Optional nickname…": + "Seudónimo opcional…", + "Post comment": + "Publicar comentario", + "Sending comment…": + "Enviando comentario…", + "Comment posted.": + "Comentario publicado.", + "Could not refresh display: %s": + "No se pudo actualizar la vista: %s", + "unknown status": + "Estado desconocido", + "server error or not responding": + "Error del servidor o el servidor no responde", + "Could not post comment: %s": + "No fue posible publicar comentario: %s", + "Sending paste…": + "Enviando \"paste\"…", + "Your paste is %s (Hit [Ctrl]+[c] to copy)": + "Su texto está en %s (Presione [Ctrl]+[c] para copiar)", + "Delete data": + "Eliminar datos", + "Could not create paste: %s": + "No fue posible crear el archivo: %s", + "Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": + "No es posible descifrar el documento: Falta la clave de descifrado en la URL (¿Utilizó un redirector o un acortador de URL que quite parte de la URL?)", + "Format": "Formato", + "Plain Text": "Texto sin formato", + "Source Code": "Código fuente", + "Markdown": "Markdown", + "Download attachment": "Descargar adjunto", + "Cloned: '%s'": "Clonado: '%s'.", + "The cloned file '%s' was attached to this paste.": "El archivo clonado '%s' ha sido adjuntado a este texto.", + "Attach a file": "Adjuntar archivo", + "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", + "File too large, to display a preview. Please download the attachment.": "File too large, to display a preview. Please download the attachment.", + "Remove attachment": "Remover adjunto", + "Your browser does not support uploading encrypted files. Please use a newer browser.": + "Tu navegador no admite la carga de archivos cifrados. Utilice un navegador más reciente.", + "Invalid attachment.": "Adjunto inválido.", + "Options": "Opciones", + "Shorten URL": "Acortar URL", + "Editor": "Editor", + "Preview": "Previsualización", + "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": + "%s requiere que el PATH termine en \"%s\". Por favor, actualice el PATH en su index.php.", + "Decrypt": + "Descifrar", + "Enter password": + "Ingrese contraseña", + "Loading…": "Cargando…", + "Decrypting paste…": "Descifrando \"paste\"…", + "Preparing new paste…": "Preparando \"paste\" nuevo…", + "In case this message never disappears please have a look at this FAQ for information to troubleshoot.": + "En caso de que este mensaje nunca desaparezca por favor revise este FAQ para obtener información para solucionar problemas.", + "+++ no paste text +++": "+++ \"paste\" sin texto +++", + "Could not get paste data: %s": + "No se pudieron obtener los datos: %s", + "QR code": "Código QR", + "This website is using an insecure HTTP connection! Please use it only for testing.": + "This website is using an insecure HTTP connection! Please use it only for testing.", + "For more information see this FAQ entry.": + "For more information see this FAQ entry.", + "Your browser may require an HTTPS connection to support the WebCrypto API. Try switching to HTTPS.": + "Your browser may require an HTTPS connection to support the WebCrypto API. Try switching to HTTPS.", + "Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.": + "Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.", + "waiting on user to provide a password": + "waiting on user to provide a password", + "Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.": + "Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.", + "Retry": + "Retry", + "Showing raw text…": + "Showing raw text…" +} diff --git a/i18n/fr.json b/i18n/fr.json new file mode 100644 index 00000000..5c71e4ba --- /dev/null +++ b/i18n/fr.json @@ -0,0 +1,181 @@ +{ + "PrivateBin": "PrivateBin", + "%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted in the browser using 256 bits AES. More information on the project page.": + "%s est un 'pastebin' (ou gestionnaire d'extraits de texte et de code source) minimaliste et open source, dans lequel le serveur n'a aucune connaissance des données envoyées. Les données sont chiffrées/déchiffrées dans le navigateur par un chiffrement AES 256 bits. Plus d'informations sur la page du projet.", + "Because ignorance is bliss": + "Parce que l'ignorance c'est le bonheur", + "en": "fr", + "Paste does not exist, has expired or has been deleted.": + "Le paste n'existe pas, a expiré, ou a été supprimé.", + "%s requires php %s or above to work. Sorry.": + "Désolé, %s nécessite php %s ou supérieur pour fonctionner.", + "%s requires configuration section [%s] to be present in configuration file.": + "%s a besoin de la section de configuration [%s] dans le fichier de configuration pour fonctionner.", + "Please wait %d seconds between each post.": + "Merci d'attendre %d secondes entre chaque publication.", + "Paste is limited to %s of encrypted data.": + "Le paste est limité à %s de données chiffrées.", + "Invalid data.": + "Données invalides.", + "You are unlucky. Try again.": + "Pas de chance. Essayez encore.", + "Error saving comment. Sorry.": + "Erreur lors de la sauvegarde du commentaire.", + "Error saving paste. Sorry.": + "Erreur lors de la sauvegarde du paste. Désolé.", + "Invalid paste ID.": + "ID du paste invalide.", + "Paste is not of burn-after-reading type.": + "Le paste n'est pas de type \"Effacer après lecture\".", + "Wrong deletion token. Paste was not deleted.": + "Jeton de suppression incorrect. Le paste n'a pas été supprimé.", + "Paste was properly deleted.": + "Le paste a été correctement supprimé.", + "JavaScript is required for %s to work.
Sorry for the inconvenience.": + "JavaScript est requis pour faire fonctionner %s.
Désolé pour cet inconvénient.", + "%s requires a modern browser to work.": + "%s nécessite un navigateur moderne pour fonctionner.", + "New": + "Nouveau", + "Send": + "Envoyer", + "Clone": + "Cloner", + "Raw text": + "Texte brut", + "Expires": + "Expire", + "Burn after reading": + "Effacer après lecture", + "Open discussion": + "Autoriser la discussion", + "Password (recommended)": + "Mot de passe (recommandé)", + "Discussion": + "Discussion", + "Toggle navigation": + "Basculer la navigation", + "%d seconds": ["%d seconde", "%d secondes"], + "%d minutes": ["%d minute", "%d minutes"], + "%d hours": ["%d heure", "%d heures"], + "%d days": ["%d jour", "%d jours"], + "%d weeks": ["%d semaine", "%d semaines"], + "%d months": ["%d mois", "%d mois"], + "%d years": ["%d an", "%d ans"], + "Never": + "Jamais", + "Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": + "Note : Ceci est un service de test : les données peuvent être supprimées à tout moment. Des chatons mourront si vous utilisez ce service de manière abusive.", + "This document will expire in %d seconds.": + ["Ce document expirera dans %d seconde.", "Ce document expirera dans %d secondes."], + "This document will expire in %d minutes.": + ["Ce document expirera dans %d minute.", "Ce document expirera dans %d minutes."], + "This document will expire in %d hours.": + ["Ce document expirera dans %d heure.", "Ce document expirera dans %d heures."], + "This document will expire in %d days.": + ["Ce document expirera dans %d jour.", "Ce document expirera dans %d jours."], + "This document will expire in %d months.": + ["Ce document expirera dans %d mois.", "Ce document expirera dans %d mois."], + "Please enter the password for this paste:": + "Entrez le mot de passe pour ce paste:", + "Could not decrypt data (Wrong key?)": + "Impossible de déchiffrer les données (mauvaise clé ?)", + "Could not delete the paste, it was not stored in burn after reading mode.": + "Impossible de supprimer le paste, car il n'a pas été stocké en mode \"Effacer après lecture\".", + "FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": + "POUR VOS YEUX UNIQUEMENT. Ne fermez pas cette fenêtre, ce paste ne pourra plus être affiché.", + "Could not decrypt comment; Wrong key?": + "Impossible de déchiffrer le commentaire; mauvaise clé ?", + "Reply": + "Répondre", + "Anonymous": + "Anonyme", + "Avatar generated from IP address": + "Avatar généré à partir de l'adresse IP", + "Add comment": + "Ajouter un commentaire", + "Optional nickname…": + "Pseudonyme optionnel…", + "Post comment": + "Poster le commentaire", + "Sending comment…": + "Envoi du commentaire…", + "Comment posted.": + "Commentaire posté.", + "Could not refresh display: %s": + "Impossible de rafraichir l'affichage : %s", + "unknown status": + "Statut inconnu", + "server error or not responding": + "Le serveur ne répond pas ou a rencontré une erreur", + "Could not post comment: %s": + "Impossible de poster le commentaire : %s", + "Sending paste…": + "Envoi du paste…", + "Your paste is %s (Hit [Ctrl]+[c] to copy)": + "Votre paste est disponible à l'adresse %s (Appuyez sur [Ctrl]+[c] pour copier)", + "Delete data": + "Supprimer les données du paste", + "Could not create paste: %s": + "Impossible de créer le paste : %s", + "Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": + "Impossible de déchiffrer le paste : Clé de déchiffrement manquante dans l'URL (Avez-vous utilisé un redirecteur ou un site de réduction d'URL qui supprime une partie de l'URL ?)", + "B": "o", + "KiB": "Kio", + "MiB": "Mio", + "GiB": "Gio", + "TiB": "Tio", + "PiB": "Pio", + "EiB": "Eio", + "ZiB": "Zio", + "YiB": "Yio", + "Format": "Format", + "Plain Text": "Texte brut", + "Source Code": "Code source", + "Markdown": "Markdown", + "Download attachment": "Télécharger la pièce jointe", + "Cloned: '%s'": "Cloner '%s'", + "The cloned file '%s' was attached to this paste.": "Le fichier cloné '%s' a été attaché à ce paste.", + "Attach a file": "Attacher un fichier ", + "alternatively drag & drop a file or paste an image from the clipboard": "alternativement, glisser & déposer un fichier ou coller une image à partir du presse-papiers", + "File too large, to display a preview. Please download the attachment.": "Fichier trop volumineux, pour afficher un aperçu. Veuillez télécharger la pièce jointe.", + "Remove attachment": "Enlever l'attachement", + "Your browser does not support uploading encrypted files. Please use a newer browser.": + "Votre navigateur ne supporte pas l'envoi de fichiers chiffrés. Merci d'utiliser un navigateur plus récent.", + "Invalid attachment.": "Attachement invalide.", + "Options": "Options", + "Shorten URL": "Raccourcir URL", + "Editor": "Éditer", + "Preview": "Prévisualiser", + "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": + "%s requiert que le PATH se termine dans un \"%s\". Veuillez mettre à jour le PATH dans votre index.php.", + "Decrypt": + "Déchiffrer", + "Enter password": + "Entrez le mot de passe", + "Loading…": "Chargement…", + "Decrypting paste…": "Déchiffrement du paste…", + "Preparing new paste…": "Préparation du paste…", + "In case this message never disappears please have a look at this FAQ for information to troubleshoot.": + "Si ce message ne disparaîssait pas, jetez un oeil à cette FAQ pour des idées de résolution (en Anglais).", + "+++ no paste text +++": "+++ pas de paste-text +++", + "Could not get paste data: %s": + "Impossible d'obtenir les données du paste: %s", + "QR code": "QR code", + "This website is using an insecure HTTP connection! Please use it only for testing.": + "Ce site web utilise une connexion HTTP non sécurisée ! Veuillez l’utiliser uniquement pour des tests.", + "For more information see this FAQ entry.": + "Pour plus d'informations consultez cette rubrique de la FAQ.", + "Your browser may require an HTTPS connection to support the WebCrypto API. Try switching to HTTPS.": + "Votre navigateur peut nécessiter une connexion HTTPS pour prendre en charge l’API WebCrypto. Essayez de passer en HTTPS.", + "Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.": + "Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.", + "waiting on user to provide a password": + "waiting on user to provide a password", + "Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.": + "Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.", + "Retry": + "Retry", + "Showing raw text…": + "Showing raw text…" +} diff --git a/i18n/hu.json b/i18n/hu.json new file mode 100644 index 00000000..c3e11a7b --- /dev/null +++ b/i18n/hu.json @@ -0,0 +1,172 @@ +{ + "PrivateBin": "PrivateBin", + "%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted in the browser using 256 bits AES. More information on the project page.": + "A %s egy minimalista, nyílt forráskódú adattároló szoftver, ahol a szerver semmilyen információt nem tárol a feltett adatról. Azt ugyanis a böngésződ segítségével titkosítja és oldja fel 256 bit hosszú titkosítási kulcsú AES-t használva. További információt a projekt oldalán találsz.", + "Because ignorance is bliss": + "A titok egyfajta hatalom.", + "en": "hu", + "Paste does not exist, has expired or has been deleted.": + "A bejegyzés nem létezik, lejárt vagy törölve lett.", + "%s requires php %s or above to work. Sorry.": + "Bocs, de a %s működéséhez %s vagy ezt meghaladó verziójú php-s környezet szükséges.", + "%s requires configuration section [%s] to be present in configuration file.": + "A %s megfelelő működéséhez a konfigurációs fájlban a [%s] résznek léteznie kell.", + "Please wait %d seconds between each post.": + "Kérlek várj %d másodpercet két beküldés között.", + "Paste is limited to %s of encrypted data.": + "A bejegyzés maximális hossza: %s", + "Invalid data.": + "Érvénytelen adat.", + "You are unlucky. Try again.": + "Peched volt, próbáld újra.", + "Error saving comment. Sorry.": + "Nem sikerült menteni a hozzászólást. Bocs.", + "Error saving paste. Sorry.": + "Nem sikerült menteni a bejegyzést. Bocs.", + "Invalid paste ID.": + "Érvénytelen bejegyzés azonosító.", + "Paste is not of burn-after-reading type.": + "A bejegyzés nem semmisül meg azonnal olvasás után.", + "Wrong deletion token. Paste was not deleted.": + "Hibás törlési azonosító. A bejegyzés nem lett törölve.", + "Paste was properly deleted.": + "A bejegyzés sikeresen törölve.", + "JavaScript is required for %s to work.
Sorry for the inconvenience.": + "JavaScript szükséges a %s működéséhez. Elnézést a fennakadásért.", + "%s requires a modern browser to work.": + "A %s működéséhez a jelenleginél újabb böngészőre van szükség.", + "New": + "Új", + "Send": + "Beküldöm!", + "Clone": + "Másol", + "Raw text": + "A nyers szöveg", + "Expires": + "Lejárati idő", + "Burn after reading": + "Törlés az első olvasás után", + "Open discussion": + "Hozzászólások engedélyezése", + "Password (recommended)": + "Jelszó (ajánlott)", + "Discussion": + "Hozzászólások", + "Toggle navigation": + "Navigáció", + "%d seconds": ["%d másodperc", "%d másodperc"], + "%d minutes": ["%d perc", "%d perc"], + "%d hours": ["%d óra", "%d óra"], + "%d days": ["%d nap", "%d nap"], + "%d weeks": ["%d hét", "%d hét"], + "%d months": ["%d hónap", "%d hónap"], + "%d years": ["%d év", "%d év"], + "Never": + "Soha", + "Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": + "Megjegyzés: ez egy teszt szolgáltatás, az adatok bármikor törlődhetnek. Ha visszaélsz vele, kiscicák bánhatják! :)", + "This document will expire in %d seconds.": + ["Ez a bejegyzés %d másodperc után megsemmisül.", "Ez a bejegyzés %d másodperc múlva megsemmisül."], + "This document will expire in %d minutes.": + ["Ez a bejegyzés %d perc után megsemmisül.", "Ez a bejegyzés %d perc múlva megsemmisül."], + "This document will expire in %d hours.": + ["Ez a bejegyzés %d óra után megsemmisül.", "Ez a bejegyzés %d óra múlva megsemmisül."], + "This document will expire in %d days.": + ["Ez a bejegyzés %d nap után megsemmisül.", "Ez a bejegyzés %d nap múlva megsemmisül."], + "This document will expire in %d months.": + ["Ez a bejegyzés %d hónap múlva megsemmisül.", "Ez a bejegyzés %d hónap múlva megsemmisül."], + "Please enter the password for this paste:": + "Add meg a szükséges jelszót a bejegyzés megtekintéséhez:", + "Could not decrypt data (Wrong key?)": + "Nem tudtuk dekódolni az adatot. Talán rossz kulcsot adtál meg?", + "Could not delete the paste, it was not stored in burn after reading mode.": + "Nem tudtuk törölni a bejegyzést, mivel az olvasás után egyből megsemmisült. Így nem is volt tárolva.", + "FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": + "EZT A BEJEGYZÉST CSAK TE LÁTHATOD!!! Ne csukd be ezt az ablakot, mivel nem tudod újra megnézni. Az ugyanis az első olvasás után rögtön megsemmisül.", + "Could not decrypt comment; Wrong key?": + "Nem tudtuk dekódolni a hozzászólást. Talán rossz kulcsot adtál meg?", + "Reply": + "Válasz", + "Anonymous": + "Anonymous", + "Avatar generated from IP address": + "Avatar (az IP cím alapján generáljuk)", + "Add comment": + "Hozzászólok", + "Optional nickname…": + "Becenév (már ha meg akarod adni)", + "Post comment": + "Beküld", + "Sending comment…": + "Beküldés alatt...", + "Comment posted.": + "A hozzászólás beküldve.", + "Could not refresh display: %s": + "Nem tudtuk frissíteni: %s", + "unknown status": + "Ismeretlen státusz.", + "server error or not responding": + "A szerveren hiba lépett fel vagy nem válaszol.", + "Could not post comment: %s": + "Nem tudtuk beküldeni a hozzászólást: %s", + "Sending paste…": + "Bejegyzés elküldése...", + "Your paste is %s (Hit [Ctrl]+[c] to copy)": + "A bejegyzésed a %s címen elérhető. [Ctrl]+[c]-vel tudod vágólapra másolni.", + "Delete data": + "Adat törlése", + "Could not create paste: %s": + "Nem tudtuk létrehozni a bejegyzést: %s", + "Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": + "Nem tudjuk dekódolni a bejegyzést: a dekódoláshoz szükséges kulcs hiányzik a címből. Talán URL rövidítőt használtál ami kivágta azt belőle?", + "Format": "Formátum", + "Plain Text": "Egyszerű szöveg", + "Source Code": "Forráskód", + "Markdown": "Markdown", + "Download attachment": "Csatolmány letöltése", + "Cloned: '%s'": "'%s' másolva", + "The cloned file '%s' was attached to this paste.": "A másolt '%s' csatolmányt hozzáadtuk ehhez a bejegyzéshez.", + "Attach a file": "Fájl csatolása", + "alternatively drag & drop a file or paste an image from the clipboard": "vagy húzz ide egy fájlt, netán illessz be egy képet a vágólapról.", + "File too large, to display a preview. Please download the attachment.": "A fájl túl nagy ahhoz, hogy előnézete legyen. Töltsd le, hogy megtekinthesd.", + "Remove attachment": "Csatolmány eltávolítása", + "Your browser does not support uploading encrypted files. Please use a newer browser.": + "A böngésződ nem támogatja titkosított fájlok feltöltését. Használj újabbat.", + "Invalid attachment.": "Érvénytelen csatolmány.", + "Options": "Opciók", + "Shorten URL": "URL rövidítés", + "Editor": "Szerkesztő felület", + "Preview": "Előnézet", + "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": + "%s számára szükséges, hogy a PATH itt végződjön: \"%s\". Kérlek frissítsd a PATH értékét az index.php fájlban.", + "Decrypt": + "Dekódolás", + "Enter password": + "Jelszó", + "Loading…": "Folyamatban...", + "Decrypting paste…": "Bejegyzés dekódolása...", + "Preparing new paste…": "Új bejegyzés előkészítése...", + "In case this message never disappears please have a look at this FAQ for information to troubleshoot.": + "Abban az esetben, ha ez az üzenet mindig látható lenne, látogass el a Gyakran Ismételt Kérdések szekcióba a megoldásához.", + "+++ no paste text +++": "+++ nincs beillesztett szöveg +++", + "Could not get paste data: %s": + "Could not get paste data: %s", + "QR code": "QR code", + "This website is using an insecure HTTP connection! Please use it only for testing.": + "This website is using an insecure HTTP connection! Please use it only for testing.", + "For more information see this FAQ entry.": + "For more information see this FAQ entry.", + "Your browser may require an HTTPS connection to support the WebCrypto API. Try switching to HTTPS.": + "Your browser may require an HTTPS connection to support the WebCrypto API. Try switching to HTTPS.", + "Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.": + "Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.", + "waiting on user to provide a password": + "waiting on user to provide a password", + "Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.": + "Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.", + "Retry": + "Retry", + "Showing raw text…": + "Showing raw text…" +} diff --git a/i18n/it.json b/i18n/it.json new file mode 100644 index 00000000..07af891b --- /dev/null +++ b/i18n/it.json @@ -0,0 +1,172 @@ +{ + "PrivateBin": "PrivateBin", + "%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted in the browser using 256 bits AES. More information on the project page.": + "%s è un sistema di tipo \"Pastebin\" online, open source, minimalista. Il server non possiede alcuna conoscenza (\"Zero Knowledge\") del contenuto dei dati inviati. I dati sono cifrati/decifrati nel Browser con algoritmo AES a 256 Bit. Per ulteriori informazioni, vedi Sito del progetto.", + "Because ignorance is bliss": + "Perché l'ignoranza è una benedizione (Because ignorance is bliss)", + "en": "it", + "Paste does not exist, has expired or has been deleted.": + "Questo messaggio non esiste, è scaduto o è stato cancellato.", + "%s requires php %s or above to work. Sorry.": + "%s richiede php %s o superiore per funzionare. Ci spiace.", + "%s requires configuration section [%s] to be present in configuration file.": + "%s richiede la presenza della sezione [%s] nei file di configurazione.", + "Please wait %d seconds between each post.": + "Attendi per favore %d secondi prima di ciascun invio.", + "Paste is limited to %s of encrypted data.": + "La dimensione del messaggio è limitata a %s di dati cifrati.", + "Invalid data.": + "Dati non validi.", + "You are unlucky. Try again.": + "Ritenta, sarai più fortunato.", + "Error saving comment. Sorry.": + "Errore durante il salvataggio del commento.", + "Error saving paste. Sorry.": + "Errore durante il salvataggio del messaggio.", + "Invalid paste ID.": + "ID-Messaggio non valido.", + "Paste is not of burn-after-reading type.": + "Il messaggio non è di tipo Distruggi-dopo-lettura.", + "Wrong deletion token. Paste was not deleted.": + "Codice cancellazione errato. Il messaggio NON è stato cancellato.", + "Paste was properly deleted.": + "Il messaggio è stato correttamente cancellato.", + "JavaScript is required for %s to work.
Sorry for the inconvenience.": + "%s funziona solo con JavaScript attivo.
Ci dispiace per l'inconveniente.", + "%s requires a modern browser to work.": + "%s richiede un browser moderno e aggiornato per funzionare.", + "New": + "Nuovo", + "Send": + "Invia", + "Clone": + "Clona", + "Raw text": + "Testo Raw", + "Expires": + "Scade", + "Burn after reading": + "Distruggi dopo lettura", + "Open discussion": + "Apri discussione", + "Password (recommended)": + "Password (raccomandato)", + "Discussion": + "Discussione", + "Toggle navigation": + "Scambia Navigazione", + "%d seconds": ["%d secondo", "%d secondi"], + "%d minutes": ["%d minuto", "%d minuti"], + "%d hours": ["%d ora", "%d ore"], + "%d days": ["%d giorno", "%d giorni"], + "%d weeks": ["%d settimana", "%d settimane"], + "%d months": ["%d mese", "%d mesi"], + "%d years": ["%d anno", "%d anni"], + "Never": + "Mai", + "Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": + "Nota: questo è un servizio di prova, i messaggi salvati possono essere cancellati in qualsiasi momento. Moriranno dei gattini se abuserai di questo servizio.", + "This document will expire in %d seconds.": + ["Questo documento scadrà tra un secondo.", "Questo documento scadrà in %d secondi."], + "This document will expire in %d minutes.": + ["Questo documento scadrà tra un minuto.", "Questo documento scadrà in %d minuti."], + "This document will expire in %d hours.": + ["Questo documento scadrà tra un'ora.", "Questo documento scadrà in %d ore."], + "This document will expire in %d days.": + ["Questo documento scadrà tra un giorno.", "Questo documento scadrà in %d giorni."], + "This document will expire in %d months.": + ["Questo documento scadrà tra un mese.", "Questo documento scadrà in %d mesi."], + "Please enter the password for this paste:": + "Inserisci la password per questo messaggio:", + "Could not decrypt data (Wrong key?)": + "Non riesco a decifrari i dati (Chiave errata?)", + "Could not delete the paste, it was not stored in burn after reading mode.": + "Non riesco a cancellare il messaggio, non è stato salvato in modalità Distruggi-dopo-lettora.", + "FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": + "FOR YOUR EYES ONLY. Non chiudere questa finestra, il messaggio non può essere visualizzato una seconda volta.", + "Could not decrypt comment; Wrong key?": + "Non riesco a decifrare il commento (Chiave errata?)", + "Reply": + "Rispondi", + "Anonymous": + "Anonimo", + "Avatar generated from IP address": + "Avatar generato dall'indirizzo IP)", + "Add comment": + "Aggiungi un commento", + "Optional nickname…": + "Nickname opzionale…", + "Post comment": + "Invia commento", + "Sending comment…": + "Commento in fase di invio…", + "Comment posted.": + "Commento inviato.", + "Could not refresh display: %s": + "Non riesco ad aggiornare il display: %s", + "unknown status": + "stato sconosciuto", + "server error or not responding": + "errore o mancata risposta dal server", + "Could not post comment: %s": + "Impossibile inviare il commento: %s", + "Sending paste…": + "Messaggio in fase di invio…", + "Your paste is %s (Hit [Ctrl]+[c] to copy)": + "Il tuo messaggio è qui: %s (Premi [Ctrl]+[c] (Windows) o [Cmd]+[c] (Mac) per copiare il link)", + "Delete data": + "Cancella i dati", + "Could not create paste: %s": + "Non riesco a creare il messaggio: %s", + "Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": + "Non riesco a decifrare il messaggio: manca la chiave di decifrazione nell'URL (La chiave è parte integrante dell'URL. Per caso hai usato un Redirector o un altro servizio che ha rimosso una parte dell'URL?)", + "Format": "Formato", + "Plain Text": "Solo Testo", + "Source Code": "Codice Sorgente", + "Markdown": "Markdown", + "Download attachment": "Scarica Allegato", + "Cloned: '%s'": "Clonato: '%s'", + "The cloned file '%s' was attached to this paste.": "Il file clonato '%s' era allegato a questo messaggio.", + "Attach a file": "Allega un file", + "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", + "File too large, to display a preview. Please download the attachment.": "File too large, to display a preview. Please download the attachment.", + "Remove attachment": "Rimuovi allegato", + "Your browser does not support uploading encrypted files. Please use a newer browser.": + "Il tuo browser non supporta l'invio di file cifrati. Utilizza un browser più recente.", + "Invalid attachment.": "Allegato non valido.", + "Options": "Opzioni", + "Shorten URL": "Accorcia URL", + "Editor": "Editor", + "Preview": "Preview", + "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": + "%s necessita che PATH termini con \"%s\". Aggiorna la variabile PATH nel tuo index.php.", + "Decrypt": + "Decifra", + "Enter password": + "Inserisci la password", + "Loading…": "Carico…", + "Decrypting paste…": "Decifro il messaggio…", + "Preparing new paste…": "Preparo il nuovo messaggio…", + "In case this message never disappears please have a look at this FAQ for information to troubleshoot.": + "Nel caso questo messaggio non scompaia, controlla questa FAQ per trovare informazioni su come risolvere il problema (in Inglese).", + "+++ no paste text +++": "+++ nessun testo nel messaggio +++", + "Could not get paste data: %s": + "Could not get paste data: %s", + "QR code": "QR code", + "This website is using an insecure HTTP connection! Please use it only for testing.": + "This website is using an insecure HTTP connection! Please use it only for testing.", + "For more information see this FAQ entry.": + "For more information see this FAQ entry.", + "Your browser may require an HTTPS connection to support the WebCrypto API. Try switching to HTTPS.": + "Your browser may require an HTTPS connection to support the WebCrypto API. Try switching to HTTPS.", + "Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.": + "Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.", + "waiting on user to provide a password": + "waiting on user to provide a password", + "Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.": + "Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.", + "Retry": + "Retry", + "Showing raw text…": + "Showing raw text…" +} diff --git a/i18n/languages.json b/i18n/languages.json new file mode 100644 index 00000000..dace6f1e --- /dev/null +++ b/i18n/languages.json @@ -0,0 +1,181 @@ +{ + "ab": ["аҧсуа бызшәа", "Abkhaz"], + "aa": ["Afaraf", "Afar"], + "af": ["Afrikaans", "Afrikaans"], + "ak": ["Akan", "Akan"], + "sq": ["Shqip", "Albanian"], + "am": ["አማርኛ", "Amharic"], + "ar": ["العربية", "Arabic"], + "an": ["aragonés", "Aragonese"], + "hy": ["Հայերեն", "Armenian"], + "as": ["অসমীয়া", "Assamese"], + "ac": ["Ástralic", "Australian"], + "av": ["авар мацӀ", "Avaric"], + "ae": ["avesta", "Avestan"], + "ay": ["aymar aru", "Aymara"], + "az": ["azərbaycan dili", "Azerbaijani"], + "bm": ["bamanankan", "Bambara"], + "ba": ["башҡорт теле", "Bashkir"], + "eu": ["euskara", "Basque"], + "be": ["беларуская мова", "Belarusian"], + "bn": ["বাংলা", "Bengali"], + "bh": ["भोजपुरी", "Bihari"], + "bi": ["Bislama", "Bislama"], + "bs": ["bosanski jezik", "Bosnian"], + "br": ["brezhoneg", "Breton"], + "bg": ["български език", "Bulgarian"], + "my": ["ဗမာစာ", "Burmese"], + "ca": ["català", "Catalan"], + "ch": ["Chamoru", "Chamorro"], + "ce": ["нохчийн мотт", "Chechen"], + "ny": ["chiCheŵa", "Chichewa"], + "zh": ["中文", "Chinese"], + "cv": ["чӑваш чӗлхи", "Chuvash"], + "kw": ["Kernewek", "Cornish"], + "co": ["corsu", "Corsican"], + "cr": ["ᓀᐦᐃᔭᐍᐏᐣ", "Cree"], + "hr": ["hrvatski jezik", "Croatian"], + "cs": ["čeština", "Czech"], + "da": ["dansk", "Danish"], + "dv": ["ދިވެހި", "Divehi"], + "nl": ["Nederlands", "Dutch"], + "dz": ["རྫོང་ཁ", "Dzongkha"], + "en": ["English", "English"], + "eo": ["Esperanto", "Esperanto"], + "et": ["eesti", "Estonian"], + "ee": ["Eʋegbe", "Ewe"], + "fo": ["føroyskt", "Faroese"], + "fj": ["vosa Vakaviti", "Fijian"], + "fi": ["suomi", "Finnish"], + "fr": ["français", "French"], + "ff": ["Fulfulde", "Fula"], + "gl": ["galego", "Galician"], + "ka": ["ქართული", "Georgian"], + "de": ["Deutsch", "German"], + "el": ["ελληνικά", "Greek"], + "gn": ["Avañe'ẽ", "Guaraní"], + "gu": ["ગુજરાતી", "Gujarati"], + "ht": ["Kreyòl ayisyen", "Haitian"], + "ha": ["هَوُسَ", "Hausa"], + "he": ["עברית", "Hebrew"], + "hz": ["Otjiherero", "Herero"], + "hi": ["हिन्दी", "Hindi"], + "ho": ["Hiri Motu", "Hiri Motu"], + "hu": ["magyar", "Hungarian"], + "ia": ["Interlingua", "Interlingua"], + "ie": ["Interlingue", "Interlingue"], + "ga": ["Gaeilge", "Irish"], + "ig": ["Asụsụ Igbo", "Igbo"], + "ik": ["Iñupiaq", "Inupiaq"], + "io": ["Ido", "Ido"], + "is": ["Íslenska", "Icelandic"], + "it": ["italiano", "Italian"], + "iu": ["ᐃᓄᒃᑎᑐᑦ", "Inuktitut"], + "ja": ["日本語", "Japanese"], + "jv": ["basa Jawa", "Javanese"], + "kl": ["kalaallisut", "Greenlandic"], + "kn": ["ಕನ್ನಡ", "Kannada"], + "kr": ["Kanuri", "Kanuri"], + "ks": ["कश्मीरी", "Kashmiri"], + "kk": ["қазақ тілі", "Kazakh"], + "km": ["ខ្មែរ", "Khmer"], + "ki": ["Gĩkũyũ", "Kikuyu"], + "rw": ["Ikinyarwanda", "Kinyarwanda"], + "ky": ["Кыргызча", "Kyrgyz"], + "kv": ["коми кыв", "Komi"], + "kg": ["Kikongo", "Kongo"], + "ko": ["한국어", "Korean"], + "ku": ["Kurdî", "Kurdish"], + "kj": ["Kuanyama", "Kwanyama"], + "la": ["lingua latina", "Latin"], + "lb": ["Lëtzebuergesch", "Luxembourgish"], + "lg": ["Luganda", "Ganda"], + "li": ["Limburgs", "Limburgish"], + "ln": ["Lingála", "Lingala"], + "lo": ["ພາສາລາວ", "Lao"], + "lt": ["lietuvių kalba", "Lithuanian"], + "lu": ["Tshiluba", "Luba-Katanga"], + "lv": ["latviešu valoda", "Latvian"], + "gv": ["Gaelg", "Manx"], + "mk": ["македонски јазик", "Macedonian"], + "mg": ["fiteny malagasy", "Malagasy"], + "ms": ["بهاس ملايو‎", "Malay"], + "ml": ["മലയാളം", "Malayalam"], + "mt": ["Malti", "Maltese"], + "mi": ["te reo Māori", "Māori"], + "mr": ["मराठी", "Marathi"], + "mh": ["Kajin M̧ajeļ", "Marshallese"], + "mn": ["Монгол хэл", "Mongolian"], + "na": ["Ekakairũ Naoero", "Nauru"], + "nv": ["Diné bizaad", "Navajo"], + "nd": ["isiNdebele", "Northern Ndebele"], + "ne": ["नेपाली", "Nepali"], + "ng": ["Owambo", "Ndonga"], + "no": ["Norsk", "Norwegian"], + "ii": ["ꆈꌠ꒿", "Nuosu"], + "nr": ["isiNdebele", "Southern Ndebele"], + "oc": ["occitan", "Occitan"], + "oj": ["ᐊᓂᔑᓈᐯᒧᐎᓐ", "Ojibwe"], + "om": ["Afaan Oromoo", "Oromo"], + "or": ["ଓଡ଼ିଆ", "Oriya"], + "os": ["ирон æвзаг", "Ossetian"], + "pa": ["ਪੰਜਾਬੀ", "Punjabi"], + "pi": ["पाऴि", "Pāli"], + "fa": ["فارسی", "Persian"], + "pl": ["polski", "Polish"], + "ps": ["پښتو", "Pashto"], + "pt": ["português", "Portuguese"], + "qu": ["Runa Simi", "Quechua"], + "rm": ["rumantsch grischun", "Romansh"], + "rn": ["Ikirundi", "Kirundi"], + "ro": ["limba română", "Romanian"], + "ru": ["Русский", "Russian"], + "sc": ["sardu", "Sardinian"], + "sd": ["सिन्धी", "Sindhi"], + "se": ["Davvisámegiella", "Northern Sami"], + "sm": ["gagana fa'a Samoa", "Samoan"], + "sg": ["yângâ tî sängö", "Sango"], + "sr": ["српски језик", "Serbian"], + "gd": ["Gàidhlig", "Gaelic"], + "sn": ["chiShona", "Shona"], + "si": ["සිංහල", "Sinhalese"], + "sk": ["slovenčina", "Slovak"], + "sl": ["slovenščina", "Slovene"], + "so": ["Soomaaliga", "Somali"], + "st": ["Sesotho", "Southern Sotho"], + "es": ["español", "Spanish"], + "su": ["Basa Sunda", "Sundanese"], + "sw": ["Kiswahili", "Swahili"], + "ss": ["SiSwati", "Swati"], + "sv": ["svenska", "Swedish"], + "ta": ["தமிழ்", "Tamil"], + "te": ["తెలుగు", "Telugu"], + "tg": ["тоҷикӣ", "Tajik"], + "th": ["ไทย", "Thai"], + "ti": ["ትግርኛ", "Tigrinya"], + "bo": ["བོད་ཡིག", "Tibetan"], + "tk": ["Түркмен", "Turkmen"], + "tl": ["ᜏᜒᜃᜅ᜔ ᜆᜄᜎᜓᜄ᜔", "Tagalog"], + "tn": ["Setswana", "Tswana"], + "to": ["faka Tonga", "Tonga"], + "tr": ["Türkçe", "Turkish"], + "ts": ["Xitsonga", "Tsonga"], + "tt": ["татар теле", "Tatar"], + "ty": ["Reo Tahiti", "Tahitian"], + "ug": ["ئۇيغۇرچە‎", "Uyghur"], + "uk": ["українська мова", "Ukrainian"], + "ur": ["اردو", "Urdu"], + "uz": ["Oʻzbek‎", "Uzbek"], + "ve": ["Tshivenḓa", "Venda"], + "vi": ["Việt Nam", "Vietnamese"], + "vo": ["Volapük", "Volapük"], + "wa": ["walon", "Walloon"], + "cy": ["Cymraeg", "Welsh"], + "wo": ["Wollof", "Wolof"], + "fy": ["Frysk", "Western Frisian"], + "xh": ["isiXhosa", "Xhosa"], + "yi": ["ייִדיש", "Yiddish"], + "yo": ["Yorùbá", "Yoruba"], + "za": ["Saɯ cueŋƅ", "Zhuang"], + "zu": ["isiZulu", "Zulu"] +} diff --git a/i18n/nl.json b/i18n/nl.json new file mode 100644 index 00000000..29554d85 --- /dev/null +++ b/i18n/nl.json @@ -0,0 +1,172 @@ +{ + "PrivateBin": "PrivateBin", + "%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted in the browser using 256 bits AES. More information on the project page.": + "%s is een minimalistische, open source online pastebin waarbij de server geen kennis heeft van de geplakte gegevens. Gegevens worden gecodeerd/gedecodeerd in de browser met behulp van 256 bits AES. Meer informatie is te vinden op de projectpagina.", + "Because ignorance is bliss": + "Onwetendheid is een zegen", + "en": "nl", + "Paste does not exist, has expired or has been deleted.": + "Geplakte tekst bestaat niet, is verlopen of verwijderd.", + "%s requires php %s or above to work. Sorry.": + "%s vereist PHP %s of hoger om te kunnen werken. Sorry", + "%s requires configuration section [%s] to be present in configuration file.": + "%s vereist dat de configuratiesectie [%s] aanwezig is in het configuratiebestand", + "Please wait %d seconds between each post.": + "Alstublieft %d seconden wachten tussen elk bericht", + "Paste is limited to %s of encrypted data.": + "Geplakte tekst is beperkt tot %s aan versleutelde gegevens", + "Invalid data.": + "Ongeldige gegevens", + "You are unlucky. Try again.": + "Helaas. Probeer het nog eens", + "Error saving comment. Sorry.": + "Fout bij het opslaan van het commentaar. Sorry", + "Error saving paste. Sorry.": + "Fout bij het opslaan van de geplakte tekst. Sorry.", + "Invalid paste ID.": + "Ongeldige ID.", + "Paste is not of burn-after-reading type.": + "Geplakte tekst is geen 'vernietig na lezen' type", + "Wrong deletion token. Paste was not deleted.": + "Foutieve verwijdercode. Geplakte tekst is niet verwijderd.", + "Paste was properly deleted.": + "Geplakte tekst is correct verwijderd.", + "JavaScript is required for %s to work.
Sorry for the inconvenience.": + "JavaScript vereist om %s te laten werken.
Sorry voor het ongemak.", + "%s requires a modern browser to work.": + "%s vereist een moderne browser om te kunnen werken ", + "New": + "Nieuw", + "Send": + "Verzenden", + "Clone": + "Clonen", + "Raw text": + "Onbewerkte tekst", + "Expires": + "Verloopt", + "Burn after reading": + "Vernietig na lezen", + "Open discussion": + "Open discussie", + "Password (recommended)": + "Wachtwoord (aanbevolen)", + "Discussion": + "Discussie", + "Toggle navigation": + "Navigatie openen/sluiten", + "%d seconds": ["%d second", "%d seconden"], + "%d minutes": ["%d minuut", "%d minuten"], + "%d hours": ["%d uur"], + "%d days": ["%d dag", "%d dagen"], + "%d weeks": ["%d week", "%d weken"], + "%d months": ["%d maand", "%d maanden"], + "%d years": ["%d jaar"], + "Never": + "Nooit", + "Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": + "Opmerking: Dit is een testservice: Gegevens kunnen op elk gegeven moment verwijderd worden.", + "This document will expire in %d seconds.": + ["Dit document verloopt over %d second.", "Dit document verloopt over %d seconden."], + "This document will expire in %d minutes.": + ["Dit document verloopt over %d minuut.", "Dit document verloopt over %d minuten"], + "This document will expire in %d hours.": + ["Dit document verloopt over %d uur."], + "This document will expire in %d days.": + ["Dit document verloopt over %d dag.", "Dit document verloopt over %d dagen."], + "This document will expire in %d months.": + ["Dit document verloopt over %d maand.", "Dit document verloopt over %d maanden."], + "Please enter the password for this paste:": + "Voer het wachtwoord in voor deze geplakte tekst:", + "Could not decrypt data (Wrong key?)": + "Kon de gegevens niet decoderen (verkeerde sleutel?)", + "Could not delete the paste, it was not stored in burn after reading mode.": + "Verwijderen van de geplakte tekst niet mogelijk, deze werd niet opgeslagen in 'vernietig na lezen' modus.", + "FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": + "FOR YOUR EYES ONLY. Sluit dit venster niet, dit bericht kan niet opnieuw worden weergegeven.", + "Could not decrypt comment; Wrong key?": + "Kon het commentaar niet decoderen; Verkeerde sleutel?", + "Reply": + "Beantwoorden", + "Anonymous": + "Anoniem", + "Avatar generated from IP address": + "Anonieme avatar (van het IP adres)", + "Add comment": + "Commentaar toevoegen", + "Optional nickname…": + "Optionele bijnaam…", + "Post comment": + "Plaats een commentaar", + "Sending comment…": + "Commentaar verzenden…", + "Comment posted.": + "Commentaar geplaatst.", + "Could not refresh display: %s": + "Kon de weergave niet vernieuwen: %s", + "unknown status": + "Onbekende status", + "server error or not responding": + "Serverfout of server reageert niet", + "Could not post comment: %s": + "Kon het commentaar niet plaatsen: %s", + "Sending paste…": + "Geplakte tekst verzenden…", + "Your paste is %s (Hit [Ctrl]+[c] to copy)": + "Uw geplakte tekst is %s (Druk [Ctrl]+[c] om te kopiëren)", + "Delete data": + "Gegevens wissen", + "Could not create paste: %s": + "Kon de geplakte tekst niet aanmaken: %s", + "Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": + "Kon de geplakte tekst niet decoderen: Decoderingssleutel ontbreekt in URL (Hebt u een redirector of een URL-verkorter gebruikt die een deel van de URL verwijdert?)", + "Format": "Formaat", + "Plain Text": "Platte tekst", + "Source Code": "Broncode", + "Markdown": "Markdown", + "Download attachment": "Bijlage downloaden", + "Cloned: '%s'": "Gekloond: '%s'", + "The cloned file '%s' was attached to this paste.": "Het gekloonde bestand '%s' is bijgevoegd aan de geplakte tekst.", + "Attach a file": "Een bestand toevoegen", + "alternatively drag & drop a file or paste an image from the clipboard": "U kunt ook een bestand slepen en neerzetten of een afbeelding plakken van het klembord", + "File too large, to display a preview. Please download the attachment.": "Het bestand is te groot om voorbeeld weer te geven. Aub de bijlage downloaden", + "Remove attachment": "Bijlage verwijderen", + "Your browser does not support uploading encrypted files. Please use a newer browser.": + "Uw browser biedt geen ondersteuning voor het uploaden van gecodeerde bestanden. Gebruik alstublieft een nieuwere browser", + "Invalid attachment.": "Ongeldige bijlage", + "Options": "Opties", + "Shorten URL": "URL verkorten", + "Editor": "Editor", + "Preview": "Preview", + "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": + "%s vereist dat het PATH eindigt in een '%s'. Aub het PATH updaten in uw index.php.", + "Decrypt": + "Decoderen", + "Enter password": + "Voer het wachtwoord in", + "Loading…": "Laden…", + "Decrypting paste…": "Geplakte tekst decoderen…", + "Preparing new paste…": "Nieuwe geplakte tekst voorbereiden…", + "In case this message never disappears please have a look at this FAQ for information to troubleshoot.": + "In het geval dat dit bericht nooit verdwijnt, kijkt u dan eens naar veelgestelde vragen voor informatie over het oplossen van problemen .", + "+++ no paste text +++": "+++ geen geplakte tekst +++", + "Could not get paste data: %s": + "Could not get paste data: %s", + "QR code": "QR code", + "This website is using an insecure HTTP connection! Please use it only for testing.": + "This website is using an insecure HTTP connection! Please use it only for testing.", + "For more information see this FAQ entry.": + "For more information see this FAQ entry.", + "Your browser may require an HTTPS connection to support the WebCrypto API. Try switching to HTTPS.": + "Your browser may require an HTTPS connection to support the WebCrypto API. Try switching to HTTPS.", + "Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.": + "Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.", + "waiting on user to provide a password": + "waiting on user to provide a password", + "Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.": + "Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.", + "Retry": + "Retry", + "Showing raw text…": + "Showing raw text…" +} diff --git a/i18n/no.json b/i18n/no.json new file mode 100644 index 00000000..a2ad2c1a --- /dev/null +++ b/i18n/no.json @@ -0,0 +1,172 @@ +{ + "PrivateBin": "PrivateBin", + "%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted in the browser using 256 bits AES. More information on the project page.": + "%s er en minimalistisk, åpen kildekode, elektronisk tilgjengelig pastebin hvor serveren ikke har kunnskap om dataene som limes inn. Dataene krypteres/dekrypteres i nettleseren ved hjelp av 256 bits AES. Mer informasjon om prosjektet på prosjektsiden.", + "Because ignorance is bliss": + "Fordi uvitenhet er lykke", + "en": "no", + "Paste does not exist, has expired or has been deleted.": + "Innlegget eksisterer ikke, er utløpt eller har blitt slettet.", + "%s requires php %s or above to work. Sorry.": + "Beklager, %s krever php %s eller nyere for å kjøre.", + "%s requires configuration section [%s] to be present in configuration file.": + "%s krever konfigurasjonsdel [%s] å være til stede i konfigurasjonsfilen .", + "Please wait %d seconds between each post.": + "Vennligst vent %d sekunder mellom hvert innlegg.", + "Paste is limited to %s of encrypted data.": + "Innlegg er begrenset til %s av kryptert data.", + "Invalid data.": + "Ugyldige data.", + "You are unlucky. Try again.": + "Du er uheldig. Prøv igjen.", + "Error saving comment. Sorry.": + "Beklager, det oppstod en feil ved lagring kommentar.", + "Error saving paste. Sorry.": + "Beklager, det oppstod en feil ved lagring innlegg.", + "Invalid paste ID.": + "Feil innlegg ID.", + "Paste is not of burn-after-reading type.": + "Innlegg er ikke av typen slett etter lesing.", + "Wrong deletion token. Paste was not deleted.": + "Feil slettingsnøkkel. Innlegg ble ikke fjernet.", + "Paste was properly deleted.": + "Innlegget er slettet.", + "JavaScript is required for %s to work.
Sorry for the inconvenience.": + "Javascript kreves for at %s skal fungere
Beklager.", + "%s requires a modern browser to work.": + "%s krever en moderne nettleser for å fungere.", + "New": + "Ny", + "Send": + "Send", + "Clone": + "Kopier", + "Raw text": + "Ren tekst", + "Expires": + "Utgår", + "Burn after reading": + "Slett etter lesing", + "Open discussion": + "Åpen diskusjon", + "Password (recommended)": + "Passord (anbefalt)", + "Discussion": + "Diskusjon", + "Toggle navigation": + "Veksle navigasjon", + "%d seconds": ["%d sekund", "%d sekunder"], + "%d minutes": ["%d minutt", "%d minutter"], + "%d hours": ["%d time", "%d timer"], + "%d days": ["%d dag", "%d dager"], + "%d weeks": ["%d uke", "%d uker"], + "%d months": ["%d måned", "%d måneder"], + "%d years": ["%d år", "%d år"], + "Never": + "Aldri", + "Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": + "Merk: Dette er en test tjeneste: Data kan slettes når som helst. Kattunger vil dø hvis du misbruker denne tjenesten.", + "This document will expire in %d seconds.": + ["Dette dokumentet vil utløpe om %d sekund.", "Dette dokumentet vil utløpe om %d sekunder."], + "This document will expire in %d minutes.": + ["Dette dokumentet vil utløpe om %d minutt.", "Dette dokumentet vil utløpe om %d minutter."], + "This document will expire in %d hours.": + ["Dette dokumentet vil utløpe om %d time.", "Dette dokumentet vil utløpe om %d timer."], + "This document will expire in %d days.": + ["Dette dokumentet vil utløpe om %d dag.", "Dette dokumentet vil utløpe om %d dager."], + "This document will expire in %d months.": + ["Dette dokumentet vil utløpe om %d måned.", "Dette dokumentet vil utløpe om %d måneder."], + "Please enter the password for this paste:": + "Vennligst skriv inn passordet for dette innlegget:", + "Could not decrypt data (Wrong key?)": + "Kunne ikke dekryptere data (Feil nøkkel?)", + "Could not delete the paste, it was not stored in burn after reading mode.": + "Kan ikke slette innlegget, det ble ikke lagret som 'slett etter les' type.", + "FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": + "KUN FOR DINE ØYNE. Ikke lukk dette vinduet, denne meldingen kan ikke bli vist igjen.", + "Could not decrypt comment; Wrong key?": + "Kan ikke dekryptere kommentar; Feil nøkkel?", + "Reply": + "Svar", + "Anonymous": + "Anonym", + "Avatar generated from IP address": + "Anonym avatar generert med data fra IP adressen)", + "Add comment": + "Legg til kommentar", + "Optional nickname…": + "Valgfritt kallenavn…", + "Post comment": + "Send kommentar", + "Sending comment…": + "Sender Kommentar…", + "Comment posted.": + "Kommentar sendt.", + "Could not refresh display: %s": + "Kunne ikke oppdatere bildet: %s", + "unknown status": + "ukjent status", + "server error or not responding": + "tjener feilet eller svarer ikke", + "Could not post comment: %s": + "Kunne ikke sende kommentar: %s", + "Sending paste…": + "Sender innlegg…", + "Your paste is %s (Hit [Ctrl]+[c] to copy)": + "Ditt innlegg er %s (Trykk [Ctrl]+[c] for å kopiere)", + "Delete data": + "Slett data", + "Could not create paste: %s": + "Kunne ikke opprette innlegg: %s", + "Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": + "Kan ikke dekryptere innlegg: Dekrypteringsnøkkelen mangler i adressen (Har du bruket en redirector eller en URL forkorter som fjerner en del av addressen?)", + "Format": "Format", + "Plain Text": "Ren Tekst", + "Source Code": "Kildekode", + "Markdown": "Oppmerket", + "Download attachment": "Last ned vedlegg", + "Cloned: '%s'": "Kopiert: '%s'", + "The cloned file '%s' was attached to this paste.": "The cloned file '%s' was attached to this paste.", + "Attach a file": "Legg til fil", + "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", + "File too large, to display a preview. Please download the attachment.": "File too large, to display a preview. Please download the attachment.", + "Remove attachment": "Slett vedlegg", + "Your browser does not support uploading encrypted files. Please use a newer browser.": + "Nettleseren din støtter ikke å laste opp krypterte filer. Vennligst bruk en nyere nettleser.", + "Invalid attachment.": "Ugyldig vedlegg.", + "Options": "Alternativer", + "Shorten URL": "Adresse forkorter", + "Editor": "Rediger", + "Preview": "Forhåndsvis", + "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": + "%s krever at PATH ender på \"%s\". Vennligst oppdater PATH i index.php.", + "Decrypt": + "Dekrypter", + "Enter password": + "Skriv inn passord", + "Loading…": "Laster…", + "Decrypting paste…": "Dekrypterer innlegg…", + "Preparing new paste…": "Klargjør nytt innlegg…", + "In case this message never disappears please have a look at this FAQ for information to troubleshoot.": + "Hvis denne meldingen ikke forsvinner kan du ta en titt på siden med ofte stilte spørsmål for informasjon om feilsøking.", + "+++ no paste text +++": "+++ ingen innleggstekst +++", + "Could not get paste data: %s": + "Kunne ikke hente utklippsdata: %s", + "QR code": "QR kode", + "This website is using an insecure HTTP connection! Please use it only for testing.": + "Denne websiden bruker usikker HTTP tilkobling! Bruk den kun for testing.", + "For more information see this FAQ entry.": + "For mer informasjon se ofte stilte spørsmål.", + "Your browser may require an HTTPS connection to support the WebCrypto API. Try switching to HTTPS.": + "Din nettleser har behov for HTTPS tilkobling for å støtte WebCrypto biblioteket. Prøv å bytt til HTTPS.", + "Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.": + "Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.", + "waiting on user to provide a password": + "waiting on user to provide a password", + "Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.": + "Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.", + "Retry": + "Retry", + "Showing raw text…": + "Showing raw text…" +} diff --git a/i18n/oc.json b/i18n/oc.json new file mode 100644 index 00000000..43a0db71 --- /dev/null +++ b/i18n/oc.json @@ -0,0 +1,181 @@ +{ + "PrivateBin": "PrivateBin", + "%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted in the browser using 256 bits AES. More information on the project page.": + "%s es un 'pastebin' (o gestionari d’extrachs de tèxte e còdi font) minimalista e open source, dins lo qual lo servidor a pas cap de coneissença de las donadas mandadas. Las donadas son chifradas/deschifradas dins lo navigator per un chiframent AES 256 bits. Mai informacions sus la pagina del projècte.", + "Because ignorance is bliss": + "Perque lo bonaür es l’ignorància", + "en": "oc", + "Paste does not exist, has expired or has been deleted.": + "Lo tèxte existís pas, a expirat, o es estat suprimit.", + "%s requires php %s or above to work. Sorry.": + "O planhèm, %s necessita php %s o superior per foncionar.", + "%s requires configuration section [%s] to be present in configuration file.": + "%s fa besonh de la seccion de configuracion [%s] dins lo fichièr de configuracion per foncionar.", + "Please wait %d seconds between each post.": + "Mercés d'esperar %d segondas entre cada publicacion.", + "Paste is limited to %s of encrypted data.": + "Lo tèxte es limitat a %s de donadas chifradas.", + "Invalid data.": + "Donadas invalidas.", + "You are unlucky. Try again.": + "Pas cap de fortuna. Tornatz ensajar.", + "Error saving comment. Sorry.": + "Error al moment de salvagardar lo comentari. O planhèm.", + "Error saving paste. Sorry.": + "Error al moment de salvagardar lo tèxte. O planhèm.", + "Invalid paste ID.": + "ID del tèxte invalid.", + "Paste is not of burn-after-reading type.": + "Lo tèxte es pas del tip \"Escafar aprèp lectura\".", + "Wrong deletion token. Paste was not deleted.": + "Geton de supression incorrècte. Lo tèxte es pas estat suprimit.", + "Paste was properly deleted.": + "Lo tèxte es estat corrèctament suprimit.", + "JavaScript is required for %s to work.
Sorry for the inconvenience.": + "JavaScript es requesit per far foncionar %s.
O planhèm per l’inconvenient.", + "%s requires a modern browser to work.": + "%s necessita un navigator modèrn per foncionar.", + "New": + "Nòu", + "Send": + "Mandar", + "Clone": + "Clonar", + "Raw text": + "Tèxte brut", + "Expires": + "Expira", + "Burn after reading": + "Escafar aprèp lectura", + "Open discussion": + "Autorizar la discussion", + "Password (recommended)": + "Senhal (recomandat)", + "Discussion": + "Discussion", + "Toggle navigation": + "Virar la navigacion", + "%d seconds": ["%d segonda", "%d segondas"], + "%d minutes": ["%d minuta", "%d minutas"], + "%d hours": ["%d ora", "%d oras"], + "%d days": ["%d jorn", "%d jorns"], + "%d weeks": ["%d setmana", "%d setmanas"], + "%d months": ["%d mes", "%d meses"], + "%d years": ["%d an", "%d ans"], + "Never": + "Jamai", + "Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": + "Nota : Aquò es un servici d’espròva : las donadas pòdon èsser suprimidas a cada moment. De catons moriràn s’abusatz d’aqueste servici.", + "This document will expire in %d seconds.": + ["Ce document expirera dans %d seconde.", "Aqueste document expirarà dins %d segondas."], + "This document will expire in %d minutes.": + ["Ce document expirera dans %d minute.", "Aqueste document expirarà dins %d minutas."], + "This document will expire in %d hours.": + ["Ce document expirera dans %d heure.", "Aqueste document expirarà dins %d oras."], + "This document will expire in %d days.": + ["Ce document expirera dans %d jour.", "Aqueste document expirarà dins %d jorns."], + "This document will expire in %d months.": + ["Ce document expirera dans %d mois.", "Aqueste document expirarà dins %d meses."], + "Please enter the password for this paste:": + "Picatz lo senhal per aqueste tèxte :", + "Could not decrypt data (Wrong key?)": + "Impossible de deschifrar las donadas (marrida clau ?)", + "Could not delete the paste, it was not stored in burn after reading mode.": + "Impossible de suprimir lo tèxte, perque es pas estat gardat en mòde \"Escafar aprèp lectura\".", + "FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": + "PER VÒSTRES UÈLHS SOLAMENT. Tampetz pas aquesta fenèstra, aqueste tèxte poirà pas mai èsser afichat.", + "Could not decrypt comment; Wrong key?": + "Impossible de deschifrar lo comentari ; marrida clau ?", + "Reply": + "Respondre", + "Anonymous": + "Anonime", + "Avatar generated from IP address": + "Avatar anonime (Vizhash de l’adreça IP)", + "Add comment": + "Apondre un comentari", + "Optional nickname…": + "Escais opcional…", + "Post comment": + "Mandar lo comentari", + "Sending comment…": + "Mandadís del comentari…", + "Comment posted.": + "Comentari mandat.", + "Could not refresh display: %s": + "Impossible d’actualizar l’afichatge : %s", + "unknown status": + "Estatut desconegut", + "server error or not responding": + "Lo servidor respond pas o a rescontrat una error", + "Could not post comment: %s": + "Impossible de mandar lo comentari : %s", + "Sending paste…": + "Mandadís del tèxte…", + "Your paste is %s (Hit [Ctrl]+[c] to copy)": + "Vòstre tèxte es disponible a l’adreça %s (Picatz sus [Ctrl]+[c] per copiar)", + "Delete data": + "Supprimir las donadas del tèxte", + "Could not create paste: %s": + "Impossible de crear lo tèxte : %s", + "Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": + "Impossible de deschifrar lo tèxte : clau de deschiframent absenta de l’URL (Avètz utilizat un redirector o un site de reduccion d’URL que suprimís una partida de l’URL ?)", + "B": "o", + "KiB": "Kio", + "MiB": "Mio", + "GiB": "Gio", + "TiB": "Tio", + "PiB": "Pio", + "EiB": "Eio", + "ZiB": "Zio", + "YiB": "Yio", + "Format": "Format", + "Plain Text": "Tèxte brut", + "Source Code": "Còdi font", + "Markdown": "Markdown", + "Download attachment": "Telecargar la pèça junta", + "Cloned: '%s'": "Clonar : '%s'", + "The cloned file '%s' was attached to this paste.": "Aqueste fichièr clonat '%s' es estat ajustat a aqueste tèxte.", + "Attach a file": "Juntar un fichièr", + "alternatively drag & drop a file or paste an image from the clipboard": "autrament lisatz lo fichièr o pegatz l’imatge del quichapapièrs", + "File too large, to display a preview. Please download the attachment.": "Fichièr tròp pesuc per mostrar un apercebut. Telecargatz la pèca junta.", + "Remove attachment": "Levar la pèça junta", + "Your browser does not support uploading encrypted files. Please use a newer browser.": + "Vòstre navigator es pas compatible amb lo mandadís de fichièrs chifrats. Mercés d’emplegar un navigator mai recent.", + "Invalid attachment.": "Pèça junta invalida.", + "Options": "Opcions", + "Shorten URL": "Acorchir l’URL", + "Editor": "Editar", + "Preview": "Previsualizar", + "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": + "%s demanda que lo PATH termine en \"%s\". Mercés de metre a jorn lo PATH dins vòstre index.php.", + "Decrypt": + "Deschifrar", + "Enter password": + "Picatz lo senhal", + "Loading…": "Cargament…", + "Decrypting paste…": "Deschirament del tèxte…", + "Preparing new paste…": "Preparacion…", + "In case this message never disappears please have a look at this FAQ for information to troubleshoot.": + "Se per cas aqueste messatge quite pas de s’afichar mercés de gaitar aquesta FAQ per las solucions (en anglés).", + "+++ no paste text +++": "+++ cap de tèxte pegat +++", + "Could not get paste data: %s": + "Recuperacion impossibla de las donadas copiadas : %s", + "QR code": "Còdi QR", + "This website is using an insecure HTTP connection! Please use it only for testing.": + "Aqueste site utiliza una connexion HTTP pas segura ! Mercés de l’utilizar pas que per d’ensages.", + "For more information see this FAQ entry.": + "Per mai d’informacions vejatz aqueste article de FAQ.", + "Your browser may require an HTTPS connection to support the WebCrypto API. Try switching to HTTPS.": + "Se pòt que vòstre navigator faga besonh d’una connexion HTTPS per èsser compatible amb l’API WebCrypto. Ensajatz de passar al HTTPS.", + "Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.": + "Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.", + "waiting on user to provide a password": + "waiting on user to provide a password", + "Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.": + "Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.", + "Retry": + "Retry", + "Showing raw text…": + "Showing raw text…" +} diff --git a/i18n/pl.json b/i18n/pl.json new file mode 100644 index 00000000..6b5cbb57 --- /dev/null +++ b/i18n/pl.json @@ -0,0 +1,172 @@ +{ + "PrivateBin": "PrivateBin", + "%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted in the browser using 256 bits AES. More information on the project page.": + "%s jest minimalistycznym, otwartoźródłowym serwisem typu pastebin, w którym serwer nie ma jakichkolwiek informacji o tym, co jest wklejane. Dane są szyfrowane i deszyfrowane w przeglądarce z użyciem 256-bitowego klucza AES. Więcej informacji na stronie projektu.", + "Because ignorance is bliss": + "Ponieważ ignorancja jest cnotą", + "en": "pl", + "Paste does not exist, has expired or has been deleted.": + "Wklejka nie istnieje, wygasła albo została usunięta.", + "%s requires php %s or above to work. Sorry.": + "%s wymaga PHP w wersji %s lub nowszej. Przykro mi.", + "%s requires configuration section [%s] to be present in configuration file.": + "%s wymaga obecności sekcji [%s] w pliku konfiguracyjnym.", + "Please wait %d seconds between each post.": + "Poczekaj %d sekund pomiędzy każdą wklejką.", + "Paste is limited to %s of encrypted data.": + "Wklejka jest limitowana do %s zaszyfrowanych danych.", + "Invalid data.": + "Nieprawidłowe dane.", + "You are unlucky. Try again.": + "Miałeś pecha. Spróbuj ponownie.", + "Error saving comment. Sorry.": + "Błąd przy zapisywaniu komentarza, sorry.", + "Error saving paste. Sorry.": + "Błąd przy zapisywaniu wklejki, sorry.", + "Invalid paste ID.": + "Nieprawidłowe ID wklejki.", + "Paste is not of burn-after-reading type.": + "Ta wklejka nie ulega autodestrukcji po przeczytaniu.", + "Wrong deletion token. Paste was not deleted.": + "Nieprawidłowy token usuwania. Wklejka nie została usunięta.", + "Paste was properly deleted.": + "Wklejka usunięta poprawnie.", + "JavaScript is required for %s to work.
Sorry for the inconvenience.": + "Do działania %sa jest wymagany JavaScript. Przepraszamy za tę niedogodność.", + "%s requires a modern browser to work.": + "%s wymaga do działania nowoczesnej przeglądarki.", + "New": + "Nowa", + "Send": + "Wyślij", + "Clone": + "Sklonuj", + "Raw text": + "Czysty tekst", + "Expires": + "Wygasa za", + "Burn after reading": + "Zniszcz po przeczytaniu", + "Open discussion": + "Otwarta dyskusja", + "Password (recommended)": + "Hasło (zalecane)", + "Discussion": + "Dyskusja", + "Toggle navigation": + "Przełącz nawigację", + "%d seconds": ["%d second", "%d second", "%d second"], + "%d minutes": ["%d minut", "%d minut", "%d minut"], + "%d hours": ["%d godzina", "%d godzina", "%d godzinę"], + "%d days": ["%d dzień", "%d dzień", "%d dzień"], + "%d weeks": ["%d tydzień", "%d tydzień", "%d tydzień"], + "%d months": ["%d miesiąc", "%d miesiąc", "%d miesiąc"], + "%d years": ["%d rok", "%d rok", "%d rok"], + "Never": + "nigdy", + "Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": + "Notka: To jest usługa testowa. Dane mogą zostać usunięte w dowolnym momencie. Kociątka umrą, jeśli nadużyjesz tej usługi.", + "This document will expire in %d seconds.": + ["Ten dokument wygaśnie za %d sekundę.", "Ten dokument wygaśnie za %d sekund."], + "This document will expire in %d minutes.": + ["Ten dokument wygaśnie za %d minutę.", "Ten dokument wygaśnie za %d minut."], + "This document will expire in %d hours.": + ["Ten dokument wygaśnie za godzinę.", "Ten dokument wygaśnie za %d godzin."], + "This document will expire in %d days.": + ["Ten dokument wygaśnie za %d dzień.", "Ten dokument wygaśnie za %d dni."], + "This document will expire in %d months.": + ["Ten dokument wygaśnie za miesiąc.", "Ten dokument wygaśnie za %d miesięcy."], + "Please enter the password for this paste:": + "Wpisz hasło dla tej wklejki:", + "Could not decrypt data (Wrong key?)": + "Nie udało się odszyfrować danych (zły klucz?)", + "Could not delete the paste, it was not stored in burn after reading mode.": + "Nie udało się usunąć wklejki, nie została zapisana w trybie zniszczenia po przeczytaniu.", + "FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": + "TYLKO DO TWOJEGO WGLĄDU. Nie zamykaj tego okna, ta wiadomość nie będzie mogła być wyświetlona ponownie.", + "Could not decrypt comment; Wrong key?": + "Nie udało się odszyfrować komentarza; zły klucz?", + "Reply": + "Odpowiedz", + "Anonymous": + "Anonim", + "Avatar generated from IP address": + "Anonimowy avatar (Vizhash z adresu IP)", + "Add comment": + "Dodaj komentarz", + "Optional nickname…": + "Opcjonalny nick…", + "Post comment": + "Wyślij komentarz", + "Sending comment…": + "Wysyłanie komentarza…", + "Comment posted.": + "Wysłano komentarz.", + "Could not refresh display: %s": + "Nie można odświeżyć widoku: %s", + "unknown status": + "nieznany status", + "server error or not responding": + "błąd serwera lub brak odpowiedzi", + "Could not post comment: %s": + "Nie udało się wysłać komentarza: %s", + "Sending paste…": + "Wysyłanie wklejki…", + "Your paste is %s (Hit [Ctrl]+[c] to copy)": + "Twoja wklejka to %s (wciśnij [Ctrl]+[c] aby skopiować)", + "Delete data": + "Skasuj dane", + "Could not create paste: %s": + "Nie udało się utworzyć wklejki: %s", + "Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": + "Nie udało się odszyfrować wklejki - brak klucza deszyfrującego w adresie (użyłeś skracacza linków, który ucina część adresu?)", + "Format": "Format", + "Plain Text": "Czysty tekst", + "Source Code": "Kod źródłowy", + "Markdown": "Markdown", + "Download attachment": "Pobierz załącznik", + "Cloned: '%s'": "Sklonowano: '%s'", + "The cloned file '%s' was attached to this paste.": "Sklonowany plik '%s' był dołączony do tej wklejki.", + "Attach a file": "Załącz plik", + "alternatively drag & drop a file or paste an image from the clipboard": "Alternatywnie przeciągnij i upuść plik albo wklej obraz ze schowka", + "File too large, to display a preview. Please download the attachment.": "Plik zbyt duży aby wyświetlić podgląd. Proszę pobrać załącznik.", + "Remove attachment": "Usuń załącznik", + "Your browser does not support uploading encrypted files. Please use a newer browser.": + "Twoja przeglądarka nie wspiera wysyłania zaszyfrowanych plików. Użyj nowszej przeglądarki.", + "Invalid attachment.": "Nieprawidłowy załącznik.", + "Options": "Opcje", + "Shorten URL": "Skróć adres URL", + "Editor": "Edytować", + "Preview": "Podgląd", + "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": + "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.", + "Decrypt": + "Odszyfruj", + "Enter password": + "Wpisz hasło", + "Loading…": "Wczytywanie…", + "Decrypting paste…": "Odszyfrowywanie wklejki…", + "Preparing new paste…": "Przygotowywanie nowej wklejki…", + "In case this message never disappears please have a look at this FAQ for information to troubleshoot.": + "W przypadku gdy ten komunikat nigdy nie znika, proszę spójrz na to FAQ aby rozwiązać problem (po angielsku).", + "+++ no paste text +++": "+++ brak wklejonego tekstu +++", + "Could not get paste data: %s": + "Nie można było pobrać danych wklejki: %s", + "QR code": "Kod QR", + "This website is using an insecure HTTP connection! Please use it only for testing.": + "This website is using an insecure HTTP connection! Please use it only for testing.", + "For more information see this FAQ entry.": + "For more information see this FAQ entry.", + "Your browser may require an HTTPS connection to support the WebCrypto API. Try switching to HTTPS.": + "Your browser may require an HTTPS connection to support the WebCrypto API. Try switching to HTTPS.", + "Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.": + "Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.", + "waiting on user to provide a password": + "waiting on user to provide a password", + "Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.": + "Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.", + "Retry": + "Retry", + "Showing raw text…": + "Showing raw text…" +} diff --git a/i18n/pt.json b/i18n/pt.json new file mode 100644 index 00000000..253a45ee --- /dev/null +++ b/i18n/pt.json @@ -0,0 +1,172 @@ +{ + "PrivateBin": "PrivateBin", + "%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted in the browser using 256 bits AES. More information on the project page.": + "%s é um serviço minimalista e de código aberto do tipo \"pastebin\", em que o servidor tem zero conhecimento dos dados copiados. Os dados são cifrados e decifrados no navegador usando 256 bits AES. Mais informações na página do projeto.", + "Because ignorance is bliss": + "Porque a ignorância é uma benção", + "en": "pt", + "Paste does not exist, has expired or has been deleted.": + "A cópia não existe, expirou ou já foi excluída.", + "%s requires php %s or above to work. Sorry.": + "%s requer php %s ou superior para funcionar. Desculpa.", + "%s requires configuration section [%s] to be present in configuration file.": + "%s requer que a seção de configuração [% s] esteja no arquivo de configuração.", + "Please wait %d seconds between each post.": + "Por favor espere %d segundos entre cada publicação.", + "Paste is limited to %s of encrypted data.": + "A cópia está limitada a %s de dados cifrados.", + "Invalid data.": + "Dados inválidos.", + "You are unlucky. Try again.": + "Você é azarado. Tente novamente", + "Error saving comment. Sorry.": + "Erro ao salvar comentário. Desculpa.", + "Error saving paste. Sorry.": + "Erro ao salvar cópia. Desculpa.", + "Invalid paste ID.": + "ID de cópia inválido.", + "Paste is not of burn-after-reading type.": + "Cópia não é do tipo \"queime após ler\".", + "Wrong deletion token. Paste was not deleted.": + "Token de remoção inválido. A cópia não foi excluída.", + "Paste was properly deleted.": + "A cópia foi devidamente excluída.", + "JavaScript is required for %s to work.
Sorry for the inconvenience.": + "JavaScript é necessário para que %s funcione.
Pedimos desculpas pela inconveniência.", + "%s requires a modern browser to work.": + "%s requer um navegador moderno para funcionar.", + "New": + "Novo", + "Send": + "Enviar", + "Clone": + "Clonar", + "Raw text": + "Texto sem formato", + "Expires": + "Expirar em", + "Burn after reading": + "Queime após ler", + "Open discussion": + "Discussão aberta", + "Password (recommended)": + "Senha (recomendada)", + "Discussion": + "Discussão", + "Toggle navigation": + "Mudar navegação", + "%d seconds": ["%d segundo", "%d segundos"], + "%d minutes": ["%d minuto", "%d minutos"], + "%d hours": ["%d hora", "%d horas"], + "%d days": ["%d dia", "%d dias"], + "%d weeks": ["%d semana", "%d semanas"], + "%d months": ["%d mês", "%d meses"], + "%d years": ["%d ano", "%d anos"], + "Never": + "Nunca", + "Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": + "Nota: Este é um serviço de teste. Dados podem ser perdidos a qualquer momento. Gatinhos morrerão se você abusar desse serviço.", + "This document will expire in %d seconds.": + ["Este documento irá expirar em um segundo.", "Este documento irá expirar em %d segundos."], + "This document will expire in %d minutes.": + ["Este documento irá expirar em um minuto.", "Este documento irá expirar em %d minutos."], + "This document will expire in %d hours.": + ["Este documento irá expirar em uma hora.", "Este documento irá expirar em %d horas."], + "This document will expire in %d days.": + ["Este documento irá expirar em um dia.", "Este documento irá expirar em %d dias."], + "This document will expire in %d months.": + ["Este documento irá expirar em um mês.", "Este documento irá expirar em %d meses."], + "Please enter the password for this paste:": + "Por favor, digite a senha para essa cópia:", + "Could not decrypt data (Wrong key?)": + "Não foi possível decifrar os dados (Chave errada?)", + "Could not delete the paste, it was not stored in burn after reading mode.": + "Não foi possível excluir a cópia, ela não foi salva no modo de \"queime após ler\".", + "FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": + "APENAS PARA SEUS OLHOS. Não feche essa janela, essa mensagem não pode ser exibida novamente.", + "Could not decrypt comment; Wrong key?": + "Não foi possível decifrar o comentário; Chave errada?", + "Reply": + "Responder", + "Anonymous": + "Anônimo", + "Avatar generated from IP address": + "Avatar gerado à partir do endereço IP", + "Add comment": + "Adicionar comentário", + "Optional nickname…": + "Apelido opcional…", + "Post comment": + "Publicar comentário", + "Sending comment…": + "Enviando comentário…", + "Comment posted.": + "Comentário publicado.", + "Could not refresh display: %s": + "Não foi possível atualizar a tela: %s", + "unknown status": + "Estado desconhecido", + "server error or not responding": + "Servidor em erro ou não responsivo", + "Could not post comment: %s": + "Não foi possível publicar o comentário: %s", + "Sending paste…": + "Enviando cópia…", + "Your paste is %s (Hit [Ctrl]+[c] to copy)": + "Sua cópia é %s (Pressione [Ctrl]+[c] para copiar)", + "Delete data": + "Excluir dados", + "Could not create paste: %s": + "Não foi possível criar cópia: %s", + "Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": + "Não foi possível decifrar a cópia: chave de decriptografia ausente na URL (Você utilizou um redirecionador ou encurtador de URL que removeu parte dela?)", + "Format": "Formato", + "Plain Text": "Texto sem formato", + "Source Code": "Código fonte", + "Markdown": "Markdown", + "Download attachment": "Baixar anexo", + "Cloned: '%s'": "Clonado: '%s'", + "The cloned file '%s' was attached to this paste.": "O arquivo clonado '%s' foi anexado a essa cópia.", + "Attach a file": "Anexar um arquivo", + "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", + "File too large, to display a preview. Please download the attachment.": "File too large, to display a preview. Please download the attachment.", + "Remove attachment": "Remover anexo", + "Your browser does not support uploading encrypted files. Please use a newer browser.": + "Seu navegador não permite subir arquivos cifrados. Por favor, utilize um navegador mais recente.", + "Invalid attachment.": "Anexo inválido.", + "Options": "Opções", + "Shorten URL": "Encurtar URL", + "Editor": "Editor", + "Preview": "Visualizar", + "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": + "%s requer que o PATH termine em \"%s\". Por favor, atualize o PATH em seu index.php.", + "Decrypt": + "Decifrar", + "Enter password": + "Digite a senha", + "Loading…": "Carregando…", + "Decrypting paste…": "Decifrando cópia…", + "Preparing new paste…": "Preparando nova cópia…", + "In case this message never disappears please have a look at this FAQ for information to troubleshoot.": + "Caso essa mensagem nunca desapareça, por favor veja este FAQ para saber como resolver os problemas.", + "+++ no paste text +++": "+++ sem texto de cópia +++", + "Could not get paste data: %s": + "Could not get paste data: %s", + "QR code": "QR code", + "This website is using an insecure HTTP connection! Please use it only for testing.": + "This website is using an insecure HTTP connection! Please use it only for testing.", + "For more information see this FAQ entry.": + "For more information see this FAQ entry.", + "Your browser may require an HTTPS connection to support the WebCrypto API. Try switching to HTTPS.": + "Your browser may require an HTTPS connection to support the WebCrypto API. Try switching to HTTPS.", + "Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.": + "Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.", + "waiting on user to provide a password": + "waiting on user to provide a password", + "Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.": + "Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.", + "Retry": + "Retry", + "Showing raw text…": + "Showing raw text…" +} diff --git a/i18n/ru.json b/i18n/ru.json new file mode 100644 index 00000000..77a03f61 --- /dev/null +++ b/i18n/ru.json @@ -0,0 +1,182 @@ +{ + "PrivateBin": "PrivateBin", + "%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted in the browser using 256 bits AES. More information on the project page.": + "%s это минималистичный Open Source проект для создания заметок, где сервер не знает ничего о сохраняемых данных. Данные шифруются/расшифровываются в браузере с использованием 256 битного шифрования AES. Подробнее можно узнать на сайте проекта.", + "Because ignorance is bliss": + "Потому что неведение - благо", + "en": "ru", + "Paste does not exist, has expired or has been deleted.": + "Запись не существует, просрочена или была удалена.", + "%s requires php %s or above to work. Sorry.": + "Для работы %s требуется php %s или выше. Извините.", + "%s requires configuration section [%s] to be present in configuration file.": + "%s необходимо наличие секции [%s] в конфигурационном файле.", + "Please wait %d seconds between each post.": + ["Пожалуйста, ожидайте %d секунду между каждыми записями.", "Пожалуйста, ожидайте %d секунды между каждыми записями.", "Пожалуйста, ожидайте %d секунд между каждыми записями."], + "Paste is limited to %s of encrypted data.": + "Размер записи ограничен %s зашифрованных данных.", + "Invalid data.": + "Неверные данные.", + "You are unlucky. Try again.": + "Вам не повезло. Попробуйте еще раз.", + "Error saving comment. Sorry.": + "Ошибка при сохранении комментария. Извините.", + "Error saving paste. Sorry.": + "Ошибка при сохранении записи. Извините.", + "Invalid paste ID.": + "Неверный ID записи.", + "Paste is not of burn-after-reading type.": + "Тип записи не \"Удалить после прочтения\".", + "Wrong deletion token. Paste was not deleted.": + "Неверный ключ удаления записи. Запись не удалена.", + "Paste was properly deleted.": + "Запись была успешно удалена.", + "JavaScript is required for %s to work.
Sorry for the inconvenience.": + "Для работы %s требуется включенный JavaScript.
Приносим извинения за неудобства.", + "%s requires a modern browser to work.": + "Для работы %s требуется более современный браузер.", + "New": + "Новая запись", + "Send": + "Отправить", + "Clone": + "Дублировать", + "Raw text": + "Исходный текст", + "Expires": + "Удалить через", + "Burn after reading": + "Удалить после прочтения", + "Open discussion": + "Открыть обсуждение", + "Password (recommended)": + "Пароль (рекомендуется)", + "Discussion": + "Обсуждение", + "Toggle navigation": + "Переключить навигацию", + "%d seconds": ["%d секунду", "%d секунды", "%d секунд"], + "%d minutes": ["%d минуту", "%d минуты", "%d минут"], + "%d hours": ["%d час", "%d часа", "%d часов"], + "%d days": ["%d день", "%d дня", "%d дней"], + "%d weeks": ["%d неделю", "%d недели", "%d недель"], + "%d months": ["%d месяц", "%d месяца", "%d месяцев"], + "%d years": ["%d год", "%d года", "%d лет"], + "Never": + "Никогда", + "Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": + "Примечание: Этот сервис тестовый: Данные могут быть удалены в любое время. Котята умрут, если вы будете злоупотреблять серсисом.", + "This document will expire in %d seconds.": + ["Документ будет удален через %d секунду.", "Документ будет удален через %d секунды.", "Документ будет удален через %d секунд."], + "This document will expire in %d minutes.": + ["Документ будет удален через %d минуту.", "Документ будет удален через %d минуты.", "Документ будет удален через %d минут."], + "This document will expire in %d hours.": + ["Документ будет удален через %d час.", "Документ будет удален через %d часа.", "Документ будет удален через %d часов."], + "This document will expire in %d days.": + ["Документ будет удален через %d день.", "Документ будет удален через %d дня.", "Документ будет удален через %d дней."], + "This document will expire in %d months.": + ["Документ будет удален через %d месяц.", "Документ будет удален через %d месяца.", "Документ будет удален через %d месяцев."], + "Please enter the password for this paste:": + "Пожалуйста, введите пароль от записи:", + "Could not decrypt data (Wrong key?)": + "Невозможно расшифровать данные (Неверный ключ?)", + "Could not delete the paste, it was not stored in burn after reading mode.": + "Невозможно удалить запись, она не была сохранена в режиме удаления после прочтения.", + "FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": + "ТОЛЬКО ДЛЯ ВАШИХ ГЛАЗ. Не закрывайте это окно, это сообщение не может быть показано снова.", + "Could not decrypt comment; Wrong key?": + "Невозможно расшифровать комментарий; Неверный ключ?", + "Reply": + "Ответить", + "Anonymous": + "Аноним", + "Avatar generated from IP address": + "Аватар, сгенерированный из IP-адреса", + "Add comment": + "Добавить комментарий", + "Optional nickname…": + "Опциональный никнейм…", + "Post comment": + "Отправить комментарий", + "Sending comment…": + "Отправка комментария…", + "Comment posted.": + "Комментарий опубликован.", + "Could not refresh display: %s": + "Не удалось обновить отображение: %s", + "unknown status": + "неизвестная причина", + "server error or not responding": + "ошибка сервера или нет ответа", + "Could not post comment: %s": + "Не удалось опубликовать комментарий: %s", + "Sending paste…": + "Отправка записи…", + "Your paste is %s (Hit [Ctrl]+[c] to copy)": + "Ссылка на запись %s (Нажмите [Ctrl]+[c], чтобы скопировать ссылку)", + "Delete data": + "Удалить запись", + "Could not create paste: %s": + "Не удалось опубликовать запись: %s", + "Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": + "Невозможно расшифровать запись: Ключ расшифровки отсутствует в ссылке (Может быть, вы используете сокращатель ссылок, который удаляет часть ссылки?)", + "B": "байт", + "KiB": "Кбайт", + "MiB": "Мбайт", + "GiB": "Гбайт", + "TiB": "Тбайт", + "PiB": "Пбайт", + "EiB": "Эбайт", + "ZiB": "Збайт", + "YiB": "Йбайт", + "Format": "Формат", + "Plain Text": "Обычный текст", + "Source Code": "Исходный код", + "Markdown": "Язык разметки", + "Download attachment": "Скачать прикрепленный файл", + "Cloned: '%s'": "Дублировано: '%s'", + "The cloned file '%s' was attached to this paste.": + "Дубликат файла '%s' был прикреплен к этой записи.", + "Attach a file": "Прикрепить файл", + "alternatively drag & drop a file or paste an image from the clipboard": "так же можно перенести файл в окно браузера или вставить изображение из буфера", + "File too large, to display a preview. Please download the attachment.": "Файл слишком большой для отображения предпросмотра. Пожалуйста, скачайте прикрепленный файл.", + "Remove attachment": "Удалить вложение", + "Your browser does not support uploading encrypted files. Please use a newer browser.": + "Ваш браузер не поддерживает отправку зашифрованных файлов. Используйте более новый браузер.", + "Invalid attachment.": "Неизвестное вложение.", + "Options": "Опции", + "Shorten URL": "Короткая ссылка", + "Editor": "Редактор", + "Preview": "Предпросмотр", + "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": + "Переменная PATH необходима %s в конце \"%s\". Пожалуйста, обновите переменную PATH в вашем index.php.", + "Decrypt": + "Расшифровать", + "Enter password": + "Введите пароль", + "Loading…": "Загрузка…", + "Decrypting paste…": "Расшифровка записи…", + "Preparing new paste…": "Подготовка новой записи…", + "In case this message never disappears please have a look at this FAQ for information to troubleshoot.": + "Если данное сообщение не исчезает длительное время, посмотрите этот FAQ с информацией о возможном решении проблемы (на английском).", + "+++ no paste text +++": "+++ в записи нет текста +++", + "Could not get paste data: %s": + "Не удалось получить данные записи: %s", + "QR code": "QR код", + "This website is using an insecure HTTP connection! Please use it only for testing.": + "Данный сайт использует незащищенное HTTP подключение! Пожалуйста используйте его только для тестирования.", + "For more information see this FAQ entry.": + "Для продробностей прочтите информацию в FAQ.", + "Your browser may require an HTTPS connection to support the WebCrypto API. Try switching to HTTPS.": + "Ваш браузер требует использования HTTPS подключения для поддержки WebCrypto API. Попробуйте переключиться на HTTPS.", + "Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.": + "Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.", + "waiting on user to provide a password": + "waiting on user to provide a password", + "Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.": + "Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.", + "Retry": + "Retry", + "Showing raw text…": + "Showing raw text…" +} diff --git a/i18n/sl.json b/i18n/sl.json new file mode 100644 index 00000000..f93d475c --- /dev/null +++ b/i18n/sl.json @@ -0,0 +1,181 @@ +{ + "PrivateBin": "PrivateBin", + "%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted in the browser using 256 bits AES. More information on the project page.": + "%s je minimalističen, odprtokodni spletni 'pastebin', kjer server ne ve ničesar o prilepljenih podatkih. Podatki so zakodirani/odkodirani v brskalniku z uporabo 256 bitnega AES. Več informacij na < href=\"https://privatebin.info/\">spletni strani projekta..", + "Because ignorance is bliss": + "Ker kar ne veš ne boli.", + "en": "sl", + "Paste does not exist, has expired or has been deleted.": + "Prilepek ne obstaja, mu je potekla življenjska doba, ali pa je izbrisan.", + "%s requires php %s or above to work. Sorry.": + "Oprosti, %s za delovanje potrebuje vsaj php %s.", + "%s requires configuration section [%s] to be present in configuration file.": + "%s potrebuje sekcijo konfiguracij [%s] v konfiguracijski datoteki.", + "Please wait %d seconds between each post.": + "Prosim počakaj vsaj %d sekund pred vsako naslednjo objavo.", + "Paste is limited to %s of encrypted data.": + "Velikost prilepka je omejena na %s zakodiranih podatkov.", + "Invalid data.": + "Neveljavni podatki.", + "You are unlucky. Try again.": + "Nimaš sreče, poskusi ponovno.", + "Error saving comment. Sorry.": + "Nekaj je šlo narobe pri shranjevanju komentarja. Oprosti.", + "Error saving paste. Sorry.": + "Nekaj je šlo narobe pri shranjevanju prilepka. Oprosti.", + "Invalid paste ID.": + "Napačen ID prilepka.", + "Paste is not of burn-after-reading type.": + "Prilepek ni tipa zažgi-po-branju.", + "Wrong deletion token. Paste was not deleted.": + "Napačen token za izbris. Prilepek ni bil izbrisan..", + "Paste was properly deleted.": + "Prilepek je uspešno izbrisan.", + "JavaScript is required for %s to work.
Sorry for the inconvenience.": + "Da %s deluje, moraš vklopiti JavaScript.
Oprosti za povročene nevšečnosti.", + "%s requires a modern browser to work.": + "%s za svoje delovanje potrebuje moderen brskalnik.", + "New": + "Nov prilepek", + "Send": + "Pošlji", + "Clone": + "Kloniraj", + "Raw text": + "Surov tekst", + "Expires": + "Poteče", + "Burn after reading": + "Zažgi (pobriši) po branju", + "Open discussion": + "Dovoli razpravo", + "Password (recommended)": + "Geslo (priporočeno)", + "Discussion": + "Razprava", + "Toggle navigation": + "Preklopi navigacijo", + "%d seconds": ["%d sekunda", "%d sekundi", "%d sekunde", "%d sekund"], + "%d minutes": ["%d minuta", "%d minuti", "%d minute", "%d minut"], + "%d hours": ["%d ura", "%d uri", "%d ure", "%d ur"], + "%d days": ["%d dan", "%d dneva", "%d dnevi", "%d dni"], + "%d weeks": ["%d teden", "%d tedna", "%d tedni", "%d tednov"], + "%d months": ["%d mesec", "%d meseca", "%d meseci", "%d mesecev"], + "%d years": ["%d leto", "%d leti", "%d leta", "%d let"], + "Never": + "Nikoli", + "Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": + "Ne pozabi: To je testna storitev: Podatki so lahko kadarkoli pobrisani. Mucki bodo umrli, če boš zlorabljala to storitev.", + "This document will expire in %d seconds.": + ["Ta dokument bo potekel čez %d sekundo.", "Ta dokument bo potekel čez %d sekundi.", "Ta dokument bo potekel čez %d sekunde.", "Ta dokument bo potekel čez %d sekund."], + "This document will expire in %d minutes.": + ["Ta dokument bo potekel čez %d minuto.", "Ta dokument bo potekel čez %d minuti.", "Ta dokument bo potekel čez %d minute.", "Ta dokument bo potekel čez %d minut."], + "This document will expire in %d hours.": + ["Ta dokument bo potekel čez %d uro.", "Ta dokument bo potekel čez %d uri.", "Ta dokument bo potekel čez %d ure.", "Ta dokument bo potekel čez %d ur."], + "This document will expire in %d days.": + ["Ta dokument bo potekel čez %d dan.", "Ta dokument bo potekel čez %d dni.", "Ta dokument bo potekel čez %d dni.", "Ta dokument bo potekel čez %d dni."], + "This document will expire in %d months.": + ["Ta dokument bo potekel čez %d mesec.", "Ta dokument bo potekel čez %d meseca.", "Ta dokument bo potekel čez %d mesece.", "Ta dokument bo potekel čez %d mesecev."], + "Please enter the password for this paste:": + "Prosim vnesi geslo tega prilepka:", + "Could not decrypt data (Wrong key?)": + "Nemogoče odkodirati podakte (Imaš napačen ključ?)", + "Could not delete the paste, it was not stored in burn after reading mode.": + "Prilepek je nemogoče izbrisati, ni bil shranjen v načinu \"zažgi po branju\".", + "FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": + "SAMO ZA TVOJE OČI. Ne zapri tega okna (zavihka), to sporočilo ne bo prikazano nikoli več.", + "Could not decrypt comment; Wrong key?": + "Ne morem odkodirati komentarja: Imaš napačen ključ?", + "Reply": + "Odgovori", + "Anonymous": + "Aninomno", + "Avatar generated from IP address": + "Anonimen avatar (Vizhash IP naslova)", + "Add comment": + "Dodaj komentar", + "Optional nickname…": + "Uporabniško ime (lahko izpustiš)", + "Post comment": + "Objavi komentar", + "Sending comment…": + "Pošiljam komentar …", + "Comment posted.": + "Komentar poslan.", + "Could not refresh display: %s": + "Ne morem osvežiti zaslona : %s", + "unknown status": + "neznan status", + "server error or not responding": + "napaka na strežniku, ali pa se strežnik ne odziva", + "Could not post comment: %s": + "Komentarja ni bilo mogoče objaviti : %s", + "Sending paste…": + "Pošiljam prilepek…", + "Your paste is %s (Hit [Ctrl]+[c] to copy)": + "Tvoj prilepek je dostopen na naslovu: %s (Pritisni [Ctrl]+[c] ali [Cmd] + [c] in skopiraj)", + "Delete data": + "Izbriši podatke", + "Could not create paste: %s": + "Ne morem ustvariti prilepka: %s", + "Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": + "Ne morem odkodirati prilepka: V URL-ju manjka ključ (A si uporabil krajšalnik URL-jev, ki odstrani del URL-ja?)", + "B": "o", + "KiB": "KB", + "MiB": "MB", + "GiB": "GB", + "TiB": "TB", + "PiB": "PB", + "EiB": "EB", + "ZiB": "ZB", + "YiB": "YB", + "Format": "Format", + "Plain Text": "Surov tekst", + "Source Code": "Odprta koda", + "Markdown": "Markdown", + "Download attachment": "Pretoči priponko", + "Cloned: '%s'": "'%s' klonirana", + "The cloned file '%s' was attached to this paste.": "The cloned file '%s' was attached to this paste.", + "Attach a file": "Pripni datoteko", + "alternatively drag & drop a file or paste an image from the clipboard": "alternatively drag & drop a file or paste an image from the clipboard", + "File too large, to display a preview. Please download the attachment.": "File too large, to display a preview. Please download the attachment.", + "Remove attachment": "Odstrani priponko", + "Your browser does not support uploading encrypted files. Please use a newer browser.": + "Tvoj brskalnik ne omogoča nalaganje zakodiranih datotek. Prosim uporabi novejši brskalnik.", + "Invalid attachment.": "Neveljavna priponka.", + "Options": "Možnosti", + "Shorten URL": "Skrajšajte URL", + "Editor": "Uredi", + "Preview": "Predogled", + "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": + "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.", + "Decrypt": + "Decrypt", + "Enter password": + "Prosim vnesi geslo", + "Loading…": "Loading…", + "Decrypting paste…": "Decrypting paste…", + "Preparing new paste…": "Preparing new paste…", + "In case this message never disappears please have a look at this FAQ for information to troubleshoot.": + "In case this message never disappears please have a look at this FAQ for information to troubleshoot (in English).", + "+++ no paste text +++": "+++ no paste text +++", + "Could not get paste data: %s": + "Could not get paste data: %s", + "QR code": "QR code", + "This website is using an insecure HTTP connection! Please use it only for testing.": + "This website is using an insecure HTTP connection! Please use it only for testing.", + "For more information see this FAQ entry.": + "For more information see this FAQ entry.", + "Your browser may require an HTTPS connection to support the WebCrypto API. Try switching to HTTPS.": + "Your browser may require an HTTPS connection to support the WebCrypto API. Try switching to HTTPS.", + "Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.": + "Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.", + "waiting on user to provide a password": + "waiting on user to provide a password", + "Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.": + "Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.", + "Retry": + "Retry", + "Showing raw text…": + "Showing raw text…" +} diff --git a/i18n/uk.json b/i18n/uk.json new file mode 100644 index 00000000..6fa2ee2c --- /dev/null +++ b/i18n/uk.json @@ -0,0 +1,182 @@ +{ + "PrivateBin": "PrivateBin", + "%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted in the browser using 256 bits AES. More information on the project page.": + "%s це мінімалістичний Open Source проєкт для створення нотаток, де сервер не знає нічого про дані, що зберігаються. Дані шифруються/розшифровуються у переглядачі з використанням 256-бітного шифрувания AES. Подробиці можна дізнатися на сайті проєкту.", + "Because ignorance is bliss": + "Бо незнання - благо", + "en": "uk", + "Paste does not exist, has expired or has been deleted.": + "Допис не існує, протермінований чи був видалений.", + "%s requires php %s or above to work. Sorry.": + "Для роботи %s потрібен php %s и вище. Вибачте.", + "%s requires configuration section [%s] to be present in configuration file.": + "%s потрібна секція [%s] в конфігураційному файлі.", + "Please wait %d seconds between each post.": + ["Будь ласка, зачекайте %d секунду між дописами.", "Будь ласка, зачекайте %d секунди між дописами.", "Будь ласка, зачекайте %d секунд між дописами."], + "Paste is limited to %s of encrypted data.": + "Розмір допису обмежений %s зашифрованих даних.", + "Invalid data.": + "Неправильні дані.", + "You are unlucky. Try again.": + "Вам не пощастило. Спробуйте ще раз.", + "Error saving comment. Sorry.": + "Помилка при збереженні коментаря. Вибачте.", + "Error saving paste. Sorry.": + "Помилка при збереженні допису. Вибачте.", + "Invalid paste ID.": + "Неправильний ID допису.", + "Paste is not of burn-after-reading type.": + "Тип допису не \"Знищити після прочитання\".", + "Wrong deletion token. Paste was not deleted.": + "Неправильний ключ вилучення допису. Допис не вилучено.", + "Paste was properly deleted.": + "Допис був вилучений повністю.", + "JavaScript is required for %s to work.
Sorry for the inconvenience.": + "Для роботи %s потрібен увімкнутий JavaScript.
Вибачте.", + "%s requires a modern browser to work.": + "Для роботи %s потрібен більш сучасний переглядач.", + "New": + "Новий допис", + "Send": + "Відправити", + "Clone": + "Дублювати", + "Raw text": + "Початковий текст", + "Expires": + "Вилучити через", + "Burn after reading": + "Знищити після прочитання", + "Open discussion": + "Відкрити обговорення", + "Password (recommended)": + "Пароль (рекомендується)", + "Discussion": + "Обговорення", + "Toggle navigation": + "Перемкнути навігацію", + "%d seconds": ["%d секунду", "%d секунди", "%d секунд"], + "%d minutes": ["%d хвилину", "%d хвилини", "%d хвилин"], + "%d hours": ["%d годину", "%d години", "%d годин"], + "%d days": ["%d день", "%d дні", "%d днів"], + "%d weeks": ["%d тиждень", "%d тижні", "%d тижнів"], + "%d months": ["%d місяць", "%d місяці", "%d місяців"], + "%d years": ["%d рік", "%d роки", "%d років"], + "Never": + "Ніколи", + "Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": + "Примітка: Це тестовий сервіс: Дані можуть бути вилучені в будь який момент. Кошенята помруть, якщо ви будете зловживати сервісом.", + "This document will expire in %d seconds.": + ["Документ буде вилучений через %d секунду.", "Документ буде вилучений через %d секунди.", "Документ буде вилучений через %d секунд."], + "This document will expire in %d minutes.": + ["Документ буде вилучений через %d хвилину.", "Документ буде вилучений через %d хвилини.", "Документ буде вилучений через %d хвилин."], + "This document will expire in %d hours.": + ["Документ буде вилучений через %d годину.", "Документ буде вилучений через %d години.", "Документ буде вилучений через %d годин."], + "This document will expire in %d days.": + ["Документ буде вилучений через %d день.", "Документ буде вилучений через %d дні.", "Документ буде вилучений через %d днів."], + "This document will expire in %d months.": + ["Документ буде вилучений через %d місяць.", "Документ буде вилучений через %d місяці.", "Документ буде вилучений через %d місяців."], + "Please enter the password for this paste:": + "Будь ласка, введіть пароль від допису:", + "Could not decrypt data (Wrong key?)": + "Неможливо розшифрувати дані (Неправильний ключ?)", + "Could not delete the paste, it was not stored in burn after reading mode.": + "Неможливо вилучити допис, він не був збережений в режимі знищити після прочитання.", + "FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": + "ЛИШЕ ДЛЯ ВАШИХ ОЧЕЙ. Не закривайте це вікно, це повідомлення не може бути показано знову.", + "Could not decrypt comment; Wrong key?": + "Неможливо розшифрувати коментар; Неправильний ключ?", + "Reply": + "Відповісти", + "Anonymous": + "Анонім", + "Avatar generated from IP address": + "Аватар зґенерований з IP-адреси", + "Add comment": + "Додати коментар", + "Optional nickname…": + "Необов’язкове прізвисько…", + "Post comment": + "Відправити коментар", + "Sending comment…": + "Відправка коментаря…", + "Comment posted.": + "Коментар опублікований.", + "Could not refresh display: %s": + "Не вдалося оновити екран: %s", + "unknown status": + "невідома причина", + "server error or not responding": + "помилка на сервері чи немає відповіді", + "Could not post comment: %s": + "Не вдалося опублікувати коментар: %s", + "Sending paste…": + "Відправка допису…", + "Your paste is %s (Hit [Ctrl]+[c] to copy)": + "Посилання на допис %s (Тисніть [Ctrl]+[c], щоб скопіювати посилання)", + "Delete data": + "Видалити допис", + "Could not create paste: %s": + "Не вдалося опублікувати допис: %s", + "Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": + "Неможливо розшифрувати запис: Ключ дешифрування відсутній в посиланні (Можливо, ви використовуєте скорочувач посилань, що видаляє частину посилання?)", + "B": "байт", + "KiB": "Кбайт", + "MiB": "Мбайт", + "GiB": "Гбайт", + "TiB": "Тбайт", + "PiB": "Пбайт", + "EiB": "Ебайт", + "ZiB": "Збайт", + "YiB": "Йбайт", + "Format": "Формат", + "Plain Text": "Звичайний текст", + "Source Code": "Джерельний код", + "Markdown": "Мова розмітки", + "Download attachment": "Звантажити прикріплений файл", + "Cloned: '%s'": "Дубльовано: '%s'", + "The cloned file '%s' was attached to this paste.": + "Дублікат файлу '%s' був прикріплений до цього запису.", + "Attach a file": "Прикріпити файл", + "alternatively drag & drop a file or paste an image from the clipboard": "також можна перенести файл у вікно переглядача чи вставити зображення з буфера", + "File too large, to display a preview. Please download the attachment.": "Файл завеликий для відображення передогляду. Будь ласка, звантажте прикріплений файл.", + "Remove attachment": "Видалити вкладення", + "Your browser does not support uploading encrypted files. Please use a newer browser.": + "Ваш переглядач не підтримує відправлення зашифрованих файлів. Використовуйте сучасніший переглядач.", + "Invalid attachment.": "Невідоме вкладення.", + "Options": "Опції", + "Shorten URL": "Коротке посилання", + "Editor": "Редактор", + "Preview": "Передогляд", + "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": + "Змінна PATH необхідна %s в конці \"%s\". Будь ласка, оновіть змінну PATH у вашому index.php.", + "Decrypt": + "Розшифрувати", + "Enter password": + "Введіть пароль", + "Loading…": "Завантаження…", + "Decrypting paste…": "Розшифровування допису…", + "Preparing new paste…": "Приготування нового допису…", + "In case this message never disappears please have a look at this FAQ for information to troubleshoot.": + "Якщо це повідомлення не зникатиме тривалий час, подивіться цей FAQ з інформацією про можливе вирішення проблеми.", + "+++ no paste text +++": "+++ у дописі немає тексту +++", + "Could not get paste data: %s": + "Не вдалося отримати дані допису: %s", + "QR code": "QR код", + "This website is using an insecure HTTP connection! Please use it only for testing.": + "Цей сайт використовує незахищене HTTP підключення! Будь ласка, використовуйте його лише для тестування.", + "For more information see this FAQ entry.": + "Для подробиць дивіться інформацію в FAQ.", + "Your browser may require an HTTPS connection to support the WebCrypto API. Try switching to HTTPS.": + "Ваш переглядач вимагає підключення HTTPS для підтримки WebCrypto API. Спробуйте перемкнутися на HTTPS.", + "Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.": + "Ваш переглядач не підтримує WebAssembly, що використовується для стиснення zlib. Ви можете створювати нестиснені документи, але не зможете читати стиснені.", + "waiting on user to provide a password": + "waiting on user to provide a password", + "Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.": + "Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.", + "Retry": + "Retry", + "Showing raw text…": + "Showing raw text…" +} diff --git a/i18n/zh.json b/i18n/zh.json new file mode 100644 index 00000000..b4bccbde --- /dev/null +++ b/i18n/zh.json @@ -0,0 +1,172 @@ +{ + "PrivateBin": "PrivateBin", + "%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted in the browser using 256 bits AES. More information on the project page.": + "%s是一个极简、开源、对粘贴内容毫不知情的在线粘贴板,数据在浏览器内进行AES-256加密。更多信息请查看项目主页。", + "Because ignorance is bliss": + "因为无知是福", + "en": "zh", + "Paste does not exist, has expired or has been deleted.": + "粘贴内容不存在,已过期或已被删除。", + "%s requires php %s or above to work. Sorry.": + "%s需要PHP %s及以上版本来工作,抱歉。", + "%s requires configuration section [%s] to be present in configuration file.": + "%s需要设置配置文件中 [%s] 部分。", + "Please wait %d seconds between each post.": + "每 %d 秒只能粘贴一次。", + "Paste is limited to %s of encrypted data.": + "粘贴受限于 %s 加密数据。", + "Invalid data.": + "无效的数据。", + "You are unlucky. Try again.": + "请再试一次。", + "Error saving comment. Sorry.": + "保存评论时出现错误,抱歉。", + "Error saving paste. Sorry.": + "保存粘贴内容时出现错误,抱歉。", + "Invalid paste ID.": + "无效的ID。", + "Paste is not of burn-after-reading type.": + "粘贴内容不是阅后即焚类型。", + "Wrong deletion token. Paste was not deleted.": + "错误的删除token,粘贴内容没有被删除。", + "Paste was properly deleted.": + "粘贴内容已被正确删除。", + "JavaScript is required for %s to work.
Sorry for the inconvenience.": + "%s需要JavaScript来进行加解密。
给你带来的不便敬请谅解。", + "%s requires a modern browser to work.": + "%s需要在现代浏览器上工作。", + "New": + "新建", + "Send": + "送出", + "Clone": + "复制", + "Raw text": + "纯文本", + "Expires": + "有效期", + "Burn after reading": + "阅后即焚", + "Open discussion": + "开放讨论", + "Password (recommended)": + "密码(推荐)", + "Discussion": + "讨论", + "Toggle navigation": + "切换导航栏", + "%d seconds": ["%d 秒", "%d 秒"], + "%d minutes": ["%d 分钟", "%d 分钟"], + "%d hours": ["%d 小时", "%d 小时"], + "%d days": ["%d 天", "%d 天"], + "%d weeks": ["%d 周", "%d 周"], + "%d months": ["%d 个月", "%d 个月"], + "%d years": ["%d 年", "%d 年"], + "Never": + "永不过期", + "Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": + "注意:这是一个测试服务,数据随时可能被删除。如果你滥用这个服务的话,小猫咪会死的。", + "This document will expire in %d seconds.": + ["这份文档将在一秒后过期。", "这份文档将在 %d 秒后过期"], + "This document will expire in %d minutes.": + ["这份文档将在一分钟后过期。", "这份文档将在 %d 分钟后过期。"], + "This document will expire in %d hours.": + ["这份文档将在一小时后过期。", "这份文档将在 %d 小时后过期。"], + "This document will expire in %d days.": + ["这份文档将在一天后过期。", "这份文档将在 %d 天后过期。"], + "This document will expire in %d months.": + ["这份文档将在一个月后过期。", "这份文档将在 %d 个月后过期。"], + "Please enter the password for this paste:": + "请输入这份粘贴内容的密码:", + "Could not decrypt data (Wrong key?)": + "无法解密数据(密钥错误?)", + "Could not delete the paste, it was not stored in burn after reading mode.": + "无法删除此粘贴内容,它没有以阅后即焚模式保存。", + "FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": + "看!仔!细!了!不要关闭窗口,否则你再也见不到这条消息了。", + "Could not decrypt comment; Wrong key?": + "无法解密评论; 密钥错误?", + "Reply": + "回复", + "Anonymous": + "匿名", + "Avatar generated from IP address": + "由IP生成的头像", + "Add comment": + "添加评论", + "Optional nickname…": + "可选昵称…", + "Post comment": + "评论", + "Sending comment…": + "评论发送中…", + "Comment posted.": + "评论已发送。", + "Could not refresh display: %s": + "无法刷新显示:%s", + "unknown status": + "未知状态", + "server error or not responding": + "服务器错误或无回应", + "Could not post comment: %s": + "无法发送评论: %s", + "Sending paste…": + "粘贴内容提交中…", + "Your paste is %s (Hit [Ctrl]+[c] to copy)": + "您粘贴内容的链接是%s (按下 [Ctrl]+[c] 以复制)", + "Delete data": + "删除数据", + "Could not create paste: %s": + "无法创建粘贴:%s", + "Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": + "无法解密粘贴:URL中缺失解密密钥(是否使用了重定向或者短链接导致密钥丢失?)", + "Format": "格式", + "Plain Text": "纯文本", + "Source Code": "源代码", + "Markdown": "Markdown", + "Download attachment": "下载附件", + "Cloned: '%s'": "副本: '%s'", + "The cloned file '%s' was attached to this paste.": "副本 '%s' 已附加到此粘贴内容。", + "Attach a file": "添加一个附件", + "alternatively drag & drop a file or paste an image from the clipboard": "拖放文件或从剪贴板粘贴图片", + "File too large, to display a preview. Please download the attachment.": "文件过大。要显示预览,请下载附件。", + "Remove attachment": "移除附件", + "Your browser does not support uploading encrypted files. Please use a newer browser.": + "您的浏览器不支持上传加密的文件,请使用更新的浏览器。", + "Invalid attachment.": "无效的附件", + "Options": "选项", + "Shorten URL": "缩短链接", + "Editor": "编辑", + "Preview": "预览", + "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": + "%s 的 PATH 变量必须结束于 \"%s\"。 请修改你的 index.php 中的 PATH 变量。", + "Decrypt": + "解密", + "Enter password": + "输入密码", + "Loading…": "载入中…", + "Decrypting paste…": "正在解密", + "Preparing new paste…": "正在准备新的粘贴内容", + "In case this message never disappears please have a look at this FAQ for information to troubleshoot.": + "如果这个消息一直存在,请参考 这里的 FAQ (英文版)进行故障排除。", + "+++ no paste text +++": "+++ 没有粘贴内容 +++", + "Could not get paste data: %s": + "无法获取粘贴数据:%s", + "QR code": "二维码", + "This website is using an insecure HTTP connection! Please use it only for testing.": + "该网站使用了不安全的HTTP连接! 请仅将其用于测试。", + "For more information see this FAQ entry.": + "有关更多信息,请参阅此常见问题解答。", + "Your browser may require an HTTPS connection to support the WebCrypto API. Try switching to HTTPS.": + "您的浏览器可能需要HTTPS连接才能支持WebCrypto API。 尝试切换到HTTPS 。", + "Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.": + "您的浏览器不支持用于zlib压缩的WebAssembly。 您可以创建未压缩的文档,但不能读取压缩的文档。", + "waiting on user to provide a password": + "请输入密码", + "Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.": + "无法解密数据。 您输入了错误的密码吗? 点顶部的按钮重试。", + "Retry": + "重试", + "Showing raw text…": + "显示原始文字…" +} diff --git a/img/android-chrome-192x192.png b/img/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..42baf7532f7c05cc70cc10ba87d439d9c9430d7d GIT binary patch literal 5557 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�|_bmAFOPt)pezimddp}xL~ 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 AhyVZp literal 0 HcmV?d00001 diff --git a/img/apple-touch-icon.png b/img/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..aa6e2b04f5aad58330fe940912389c386cac964b GIT binary patch literal 3967 zcmV-_4}kEAP)jr6`V&EAt53EuoQfJd}lQk|D_dxJ{021aZg7i zP*6~Uf`Xu+p!{wW=4lnXR~6E~bk1HCa%MJPUR|AzPwVUJU{)>H!D^^b6?1WEu%1

EtG@Gs)<@X>E4 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 F0RRA>u*CoX literal 0 HcmV?d00001 diff --git a/img/favicon-32x32.png b/img/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..be42cb39f80d27c172bff4e647048f3af8eb45c3 GIT binary patch literal 749 zcmV<{00000001#DF(Dx#RaI3aBqT5}FaZDn|K1e;+7J$I( z761Gc|MnFb85sZN6^>Rg|I8C&CjxB>%S~yk#IJBOGij0)jLF?(62b zv#p_gTm6zqk6%0gqBzxdH2=*nYDFXeiXZ=b8?;6Q?9{^1v!9xllGvt(rjC5$muPTO zKd@vquUHxXxd(JO0>gtz+W-In3v^OWQveOYWA?Np`KgLaDleTw00057Nkl%lDxrwAnD#b z>~_A74~kQ%F3WF}-J&?2NaCu@zbd`MgX4)191&8TmF1sL@!z}dq+F`4TS>c{>bKN7_L1|#{NQZxese>L1(JTs0di#`yseP{m)ZhM>Jw{AxOz_Kp0XZ zksO6>Uwain*a1PmWjlJsc@X;4u_^>Jv(8wvI1B28HVPs9V$6)`tBr!J5q{&3Jy9oU zsz`y6(5H&3pm2{?$gE&y0o{UE1RSBM<82{a&;ZRvRp7S6SON9|9AG!;gxGdyU%5qX z<07e{B1mftm%`BHsTIIv&KNnNb%D81D$SPfztbm!8`DdOe9Q&r{T<4Q2Eb^5#>>f; zl~oTs;mKA$5IMJs`MIg>8k+1P!aJE@X_i3x=@^`7Dx literal 0 HcmV?d00001 diff --git a/img/favicon.ico b/img/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..e3bc3e239dc3e16b4ae63ca55e1aaf2b40bb5158 GIT binary patch literal 15086 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 Rt?18a1L1YXFqS#Y{Xbs2mQVly literal 0 HcmV?d00001 diff --git a/img/icon.svg b/img/icon.svg new file mode 100644 index 00000000..d63c65db --- /dev/null +++ b/img/icon.svg @@ -0,0 +1 @@ + diff --git a/img/icon_clone.png b/img/icon_clone.png new file mode 100644 index 0000000000000000000000000000000000000000..455b82f9a40a71933355b6ad0f55aea953e6c72e GIT binary patch literal 266 zcmeAS@N?(olHy`uVBq!ia0vp^{6H+o!3-o#udq!9Qh@ea+PQNlkP8&twQJYo$B(B?n+D;&fB$~|{P~HAiA$C&*|u%l z`t|FlOqr6Ko7;I{;d+owB|(0{3@;-+{vD|B(0~8<@r@f7)748X?|ueKhI_g=hDcmK zdfrp0L4n65&{Ja0)Q+Zm{}-4|TV(#>eO!Lf$_omX&c$uT>$(l!B&}JMSTE{i6lP#^ z?@I=&^TzAKf*-TjOE10hcFQ8>@CTPZZH`X+x9j+B^=Sh9;#@}$rvt5E@O1TaS?83{ F1OQGUes}-? literal 0 HcmV?d00001 diff --git a/img/icon_email.png b/img/icon_email.png new file mode 100644 index 0000000000000000000000000000000000000000..cd3fdf422b61e80d2812001a701685127c7c94dd GIT binary patch literal 253 zcmeAS@N?(olHy`uVBq!ia0vp^{2^||vvRG=#vlpDl qUa$o&&|6^nD53a4*a6*ELx#eO&I}R8*Y$w*FnGH9xvX+D)A6&FK&hl2) z`plinyn2^5%-puJuz>gM-gga;+78dTe`bZ^k10>JPd)$Y?e1ss_3G?ZyQUc4NV+a2 vyz7(tW{oR8A)+^@2=;{q{G9pw{uTC(YvKhj)l26Boy*|q>gTe~DWM4fSHFGk literal 0 HcmV?d00001 diff --git a/img/icon_raw.png b/img/icon_raw.png new file mode 100644 index 0000000000000000000000000000000000000000..41b586f0768436cdbcd96d9e37efca73396a2acd GIT binary patch literal 183 zcmeAS@N?(olHy`uVBq!ia0vp^{2A# d!jqYp8BTu?u$gks^cBz+22WQ%mvv4FO#nJ2IC%g7 literal 0 HcmV?d00001 diff --git a/img/icon_send.png b/img/icon_send.png new file mode 100644 index 0000000000000000000000000000000000000000..a6e62ebd155de13a1254600643cb481cd14d106b GIT binary patch literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^LO{&V!VDy(S2QUCDXjpX5LY1mpE%IA`;gTe~DWM4fS&vna*S0MeL5ZJ=m`x2;*yCldj znBm*IlRN9OBh;jMr}SNW1Qd4hba4#fxSp($z`&%il5>%TsKmC0jA^_)yM-G{%qC1r zNO&-T?b2*Xi5cb0FYhw)Tug}S@|HT+e)8~@!(R`dX`acynV;dPg3R4&+4Vnw<}rA> L`njxgN@xNA9FSGS literal 0 HcmV?d00001 diff --git a/img/logo.svg b/img/logo.svg new file mode 100644 index 00000000..edbc27ef --- /dev/null +++ b/img/logo.svg @@ -0,0 +1 @@ +PrivateBin diff --git a/img/mstile-144x144.png b/img/mstile-144x144.png new file mode 100644 index 0000000000000000000000000000000000000000..819530770bc9c5c1a8c68177e896fc2f89bedca1 GIT binary patch literal 3644 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 literal 0 HcmV?d00001 diff --git a/img/mstile-70x70.png b/img/mstile-70x70.png new file mode 100644 index 0000000000000000000000000000000000000000..02b11be03649f5f493d68667acc0fbfd1085d580 GIT binary patch literal 2424 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 diff --git a/index.php b/index.php new file mode 100644 index 00000000..09e5e684 --- /dev/null +++ b/index.php @@ -0,0 +1,18 @@ += 255) { throw new TypeError('Alphabet too long') } + var BASE_MAP = new Uint8Array(256) + BASE_MAP.fill(255) + for (var i = 0; i < ALPHABET.length; i++) { + var x = ALPHABET.charAt(i) + var xc = x.charCodeAt(0) + if (BASE_MAP[xc] !== 255) { throw new TypeError(x + ' is ambiguous') } + BASE_MAP[xc] = i + } + var BASE = ALPHABET.length + var LEADER = ALPHABET.charAt(0) + var FACTOR = Math.log(BASE) / Math.log(256) // log(BASE) / log(256), rounded up + var iFACTOR = Math.log(256) / Math.log(BASE) // log(256) / log(BASE), rounded up + function encode (source) { + if (source.length === 0) { return '' } + // Skip & count leading zeroes. + var zeroes = 0 + var length = 0 + var pbegin = 0 + var pend = source.length + while (pbegin !== pend && source[pbegin] === 0) { + pbegin++ + zeroes++ + } + // Allocate enough space in big-endian base58 representation. + var size = ((pend - pbegin) * iFACTOR + 1) >>> 0 + var b58 = new Uint8Array(size) + // Process the bytes. + while (pbegin !== pend) { + var carry = source[pbegin] + // Apply "b58 = b58 * 256 + ch". + var i = 0 + for (var it1 = size - 1; (carry !== 0 || i < length) && (it1 !== -1); it1--, i++) { + carry += (256 * b58[it1]) >>> 0 + b58[it1] = (carry % BASE) >>> 0 + carry = (carry / BASE) >>> 0 + } + if (carry !== 0) { throw new Error('Non-zero carry') } + length = i + pbegin++ + } + // Skip leading zeroes in base58 result. + var it2 = size - length + while (it2 !== size && b58[it2] === 0) { + it2++ + } + // Translate the result into a string. + var str = LEADER.repeat(zeroes) + for (; it2 < size; ++it2) { str += ALPHABET.charAt(b58[it2]) } + return str + } + function decodeUnsafe (source) { + if (typeof source !== 'string') { throw new TypeError('Expected String') } + if (source.length === 0) { return '' } + var psz = 0 + // Skip leading spaces. + if (source[psz] === ' ') { return } + // Skip and count leading '1's. + var zeroes = 0 + var length = 0 + while (source[psz] === LEADER) { + zeroes++ + psz++ + } + // Allocate enough space in big-endian base256 representation. + var size = (((source.length - psz) * FACTOR) + 1) >>> 0 // log(58) / log(256), rounded up. + var b256 = new Uint8Array(size) + // Process the characters. + while (source[psz]) { + // Decode character + var carry = BASE_MAP[source.charCodeAt(psz)] + // Invalid character + if (carry === 255) { return } + var i = 0 + for (var it3 = size - 1; (carry !== 0 || i < length) && (it3 !== -1); it3--, i++) { + carry += (BASE * b256[it3]) >>> 0 + b256[it3] = (carry % 256) >>> 0 + carry = (carry / 256) >>> 0 + } + if (carry !== 0) { throw new Error('Non-zero carry') } + length = i + psz++ + } + // Skip trailing spaces. + if (source[psz] === ' ') { return } + // Skip leading zeroes in b256. + var it4 = size - length + while (it4 !== size && b256[it4] === 0) { + it4++ + } + var vch = [] + var j = zeroes + while (it4 !== size) { + vch[j++] = b256[it4++] + } + return vch + } + function decode (string) { + var buffer = decodeUnsafe(string) + if (buffer) { return buffer } + throw new Error('Non-base' + BASE + ' character') + } + return { + encode: encode, + decodeUnsafe: decodeUnsafe, + decode: decode + } +} +}).call(this); diff --git a/js/base64-1.7.js b/js/base64-1.7.js new file mode 100644 index 00000000..5dfa05ae --- /dev/null +++ b/js/base64-1.7.js @@ -0,0 +1,237 @@ +/* + * $Id: base64.js,v 1.7 2012/08/23 10:30:18 dankogai Exp dankogai $ + * + * Licensed under the MIT license. + * https://www.opensource.org/licenses/mit-license.php + * + * References: + * https://en.wikipedia.org/wiki/Base64 + */ + +(function(global){ + +var b64chars + = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; + +var b64charcodes = function(){ + var a = []; + var codeA = 'A'.charCodeAt(0); + var codea = 'a'.charCodeAt(0); + var code0 = '0'.charCodeAt(0); + for (var i = 0; i < 26; i ++) a.push(codeA + i); + for (var i = 0; i < 26; i ++) a.push(codea + i); + for (var i = 0; i < 10; i ++) a.push(code0 + i); + a.push('+'.charCodeAt(0)); + a.push('/'.charCodeAt(0)); + return a; +}(); + +var b64tab = function(bin){ + var t = {}; + for (var i = 0, l = bin.length; i < l; i++) t[bin.charAt(i)] = i; + return t; +}(b64chars); + +var stringToArray = function(s){ + var a = []; + for (var i = 0, l = s.length; i < l; i ++) a[i] = s.charCodeAt(i); + return a; +}; + +var convertUTF8ArrayToBase64 = function(bin){ + var padlen = 0; + while (bin.length % 3){ + bin.push(0); + padlen++; + }; + var b64 = []; + for (var i = 0, l = bin.length; i < l; i += 3){ + var c0 = bin[i], c1 = bin[i+1], c2 = bin[i+2]; + if (c0 >= 256 || c1 >= 256 || c2 >= 256) + throw 'unsupported character found'; + var n = (c0 << 16) | (c1 << 8) | c2; + b64.push( + b64charcodes[ n >>> 18], + b64charcodes[(n >>> 12) & 63], + b64charcodes[(n >>> 6) & 63], + b64charcodes[ n & 63] + ); + } + while (padlen--) b64[b64.length - padlen - 1] = '='.charCodeAt(0); + return chunkStringFromCharCodeApply(b64); +}; + +var convertBase64ToUTF8Array = function(b64){ + b64 = b64.replace(/[^A-Za-z0-9+\/]+/g, ''); + var bin = []; + var padlen = b64.length % 4; + for (var i = 0, l = b64.length; i < l; i += 4){ + var n = ((b64tab[b64.charAt(i )] || 0) << 18) + | ((b64tab[b64.charAt(i+1)] || 0) << 12) + | ((b64tab[b64.charAt(i+2)] || 0) << 6) + | ((b64tab[b64.charAt(i+3)] || 0)); + bin.push( + ( n >> 16 ), + ( (n >> 8) & 0xff ), + ( n & 0xff ) + ); + } + bin.length -= [0,0,2,1][padlen]; + return bin; +}; + +var convertUTF16ArrayToUTF8Array = function(uni){ + var bin = []; + for (var i = 0, l = uni.length; i < l; i++){ + var n = uni[i]; + if (n < 0x80) + bin.push(n); + else if (n < 0x800) + bin.push( + 0xc0 | (n >>> 6), + 0x80 | (n & 0x3f)); + else + bin.push( + 0xe0 | ((n >>> 12) & 0x0f), + 0x80 | ((n >>> 6) & 0x3f), + 0x80 | (n & 0x3f)); + } + return bin; +}; + +var convertUTF8ArrayToUTF16Array = function(bin){ + var uni = []; + for (var i = 0, l = bin.length; i < l; i++){ + var c0 = bin[i]; + if (c0 < 0x80){ + uni.push(c0); + }else{ + var c1 = bin[++i]; + if (c0 < 0xe0){ + uni.push(((c0 & 0x1f) << 6) | (c1 & 0x3f)); + }else{ + var c2 = bin[++i]; + uni.push( + ((c0 & 0x0f) << 12) | ((c1 & 0x3f) << 6) | (c2 & 0x3f) + ); + } + } + } + return uni; +}; + +var convertUTF8StringToBase64 = function(bin){ + return convertUTF8ArrayToBase64(stringToArray(bin)); +}; + +var convertBase64ToUTF8String = function(b64){ + return chunkStringFromCharCodeApply(convertBase64ToUTF8Array(b64)); +}; + +var convertUTF8StringToUTF16Array = function(bin){ + return convertUTF8ArrayToUTF16Array(stringToArray(bin)); +}; + +var convertUTF8ArrayToUTF16String = function(bin){ + return chunkStringFromCharCodeApply(convertUTF8ArrayToUTF16Array(bin)); +}; + +var convertUTF8StringToUTF16String = function(bin){ + return chunkStringFromCharCodeApply( + convertUTF8ArrayToUTF16Array(stringToArray(bin)) + ); +}; + +var convertUTF16StringToUTF8Array = function(uni){ + return convertUTF16ArrayToUTF8Array(stringToArray(uni)); +}; + +var convertUTF16ArrayToUTF8String = function(uni){ + return chunkStringFromCharCodeApply(convertUTF16ArrayToUTF8Array(uni)); +}; + +var convertUTF16StringToUTF8String = function(uni){ + return chunkStringFromCharCodeApply( + convertUTF16ArrayToUTF8Array(stringToArray(uni)) + ); +}; + +/* + * String.fromCharCode.apply will only handle arrays as big as 65536, + * after that it'll return a truncated string with no warning. + */ +var chunkStringFromCharCodeApply = function(arr){ + var strs = [], i; + for (i = 0; i < arr.length; i += 65536){ + strs.push(String.fromCharCode.apply(String, arr.slice(i, i+65536))); + } + return strs.join(''); +}; + +if (global.btoa){ + var btoa = global.btoa; + var convertUTF16StringToBase64 = function (uni){ + return btoa(convertUTF16StringToUTF8String(uni)); + }; +} +else { + var btoa = convertUTF8StringToBase64; + var convertUTF16StringToBase64 = function (uni){ + return convertUTF8ArrayToBase64(convertUTF16StringToUTF8Array(uni)); + }; +} + +if (global.atob){ + var atob = global.atob; + var convertBase64ToUTF16String = function (b64){ + return convertUTF8StringToUTF16String(atob(b64)); + }; +} +else { + var atob = convertBase64ToUTF8String; + var convertBase64ToUTF16String = function (b64){ + return convertUTF8ArrayToUTF16String(convertBase64ToUTF8Array(b64)); + }; +} + +global.Base64 = { + convertUTF8ArrayToBase64:convertUTF8ArrayToBase64, + convertByteArrayToBase64:convertUTF8ArrayToBase64, + convertBase64ToUTF8Array:convertBase64ToUTF8Array, + convertBase64ToByteArray:convertBase64ToUTF8Array, + convertUTF16ArrayToUTF8Array:convertUTF16ArrayToUTF8Array, + convertUTF16ArrayToByteArray:convertUTF16ArrayToUTF8Array, + convertUTF8ArrayToUTF16Array:convertUTF8ArrayToUTF16Array, + convertByteArrayToUTF16Array:convertUTF8ArrayToUTF16Array, + convertUTF8StringToBase64:convertUTF8StringToBase64, + convertBase64ToUTF8String:convertBase64ToUTF8String, + convertUTF8StringToUTF16Array:convertUTF8StringToUTF16Array, + convertUTF8ArrayToUTF16String:convertUTF8ArrayToUTF16String, + convertByteArrayToUTF16String:convertUTF8ArrayToUTF16String, + convertUTF8StringToUTF16String:convertUTF8StringToUTF16String, + convertUTF16StringToUTF8Array:convertUTF16StringToUTF8Array, + convertUTF16StringToByteArray:convertUTF16StringToUTF8Array, + convertUTF16ArrayToUTF8String:convertUTF16ArrayToUTF8String, + convertUTF16StringToUTF8String:convertUTF16StringToUTF8String, + convertUTF16StringToBase64:convertUTF16StringToBase64, + convertBase64ToUTF16String:convertBase64ToUTF16String, + fromBase64:convertBase64ToUTF8String, + toBase64:convertUTF8StringToBase64, + atob:atob, + btoa:btoa, + utob:convertUTF16StringToUTF8String, + btou:convertUTF8StringToUTF16String, + encode:convertUTF16StringToBase64, + encodeURI:function(u){ + return convertUTF16StringToBase64(u).replace(/[+\/]/g, function(m0){ + return m0 == '+' ? '-' : '_'; + }).replace(/=+$/, ''); + }, + decode:function(a){ + return convertBase64ToUTF16String(a.replace(/[-_]/g, function(m0){ + return m0 == '-' ? '+' : '/'; + })); + } +}; + +})(this); diff --git a/js/bootstrap-3.3.7.js b/js/bootstrap-3.3.7.js new file mode 100644 index 00000000..9bcd2fcc --- /dev/null +++ b/js/bootstrap-3.3.7.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under the MIT license + */ +if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1||b[0]>3)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){if(a(b.target).is(this))return b.handleObj.handler.apply(this,arguments)}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.7",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a("#"===f?[]:f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.7",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c).prop(c,!0)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c).prop(c,!1))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")?(c.prop("checked")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.prop("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target).closest(".btn");b.call(d,"toggle"),a(c.target).is('input[type="radio"], input[type="checkbox"]')||(c.preventDefault(),d.is("input,button")?d.trigger("focus"):d.find("input:visible,button:visible").first().trigger("focus"))}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.7",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));if(!(a>this.$items.length-1||a<0))return this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){if(!this.sliding)return this.slide("next")},c.prototype.prev=function(){if(!this.sliding)return this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.7",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger(a.Event("hidden.bs.dropdown",f)))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.7",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger(a.Event("shown.bs.dropdown",h))}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&jdocument.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth

',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);if(c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusout"==b.type?"focus":"hover"]=!1),!c.isInStateTrue())return clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-mo.width?"left":"left"==h&&k.left-lg.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;jg.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null,a.$element=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;!e&&/destroy|hide/.test(b)||(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.7",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.7",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b=e[a]&&(void 0===e[a+1]||b .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.7",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return e=a-d&&"bottom"},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery); \ No newline at end of file diff --git a/js/comment.jsonld b/js/comment.jsonld new file mode 100644 index 00000000..b334ff4b --- /dev/null +++ b/js/comment.jsonld @@ -0,0 +1,35 @@ +{ + "@context": { + "so": "https://schema.org/", + "pb": "?jsonld=types#", + "cm": "?jsonld=commentmeta#", + "status": { + "@type": "so:Integer" + }, + "id": { + "@type": "so:name" + }, + "pasteid": { + "@type": "so:name" + }, + "parentid": { + "@type": "so:name" + }, + "url": { + "@type": "so:url" + }, + "v": { + "@type": "so:Integer", + "@value": 2 + }, + "ct": { + "@type": "pb:CipherText" + }, + "adata": { + "@type": "pb:CipherParameters" + }, + "meta": { + "@type": "cm:MetaData" + } + } +} \ No newline at end of file diff --git a/js/commentmeta.jsonld b/js/commentmeta.jsonld new file mode 100644 index 00000000..136b70d8 --- /dev/null +++ b/js/commentmeta.jsonld @@ -0,0 +1,14 @@ +{ + "@context": { + "so": "https://schema.org/", + "pb": "?jsonld=types#" + }, + "MetaData": { + "created": { + "@type": "CreationTime" + }, + "icon": { + "@type": "so:url" + } + } +} \ No newline at end of file diff --git a/js/jquery-3.4.1.js b/js/jquery-3.4.1.js new file mode 100644 index 00000000..a1c07fd8 --- /dev/null +++ b/js/jquery-3.4.1.js @@ -0,0 +1,2 @@ +/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0>e&1);l[Math.floor(e/3)][e%3+s-8-3]=n}for(e=0;e<18;e+=1){n=!t&&1==(r>>e&1);l[e%3+s-8-3][Math.floor(e/3)]=n}},v=function(t,r){for(var e=f<<3|r,n=w.getBCHTypeInfo(e),o=0;o<15;o+=1){var i=!t&&1==(n>>o&1);o<6?l[o][8]=i:o<8?l[o+1][8]=i:l[s-15+o][8]=i}for(o=0;o<15;o+=1){i=!t&&1==(n>>o&1);o<8?l[8][s-o-1]=i:o<9?l[8][15-o-1+1]=i:l[8][15-o-1]=i}l[s-8][8]=!t},d=function(t,r){for(var e=-1,n=s-1,o=7,i=0,a=w.getMaskFunction(r),u=s-1;0>>o&1)),a(n,u-f)&&(c=!c),l[n][u-f]=c,-1==(o-=1)&&(i+=1,o=7)}if((n+=e)<0||s<=n){n-=e,e=-e;break}}},p=function(t,r,e){for(var n=B.getRSBlocks(t,r),o=C(),i=0;i8*u)throw"code length overflow. ("+o.getLengthInBits()+">"+8*u+")";for(o.getLengthInBits()+4<=8*u&&o.put(0,4);o.getLengthInBits()%8!=0;)o.putBit(!1);for(;!(o.getLengthInBits()>=8*u||(o.put(236,8),o.getLengthInBits()>=8*u));)o.put(17,8);return function(t,r){for(var e=0,n=0,o=0,i=new Array(r.length),a=new Array(r.length),u=0;u',e+="";for(var n=0;n";for(var o=0;o';e+=""}return e+="",e+=""},h.createSvgTag=function(t,r){var e={};"object"==typeof t&&(t=(e=t).cellSize,r=e.margin),t=t||2,r=void 0===r?4*t:r;var n,o,i,a,u=h.getModuleCount()*t+2*r,f="";for(a="l"+t+",0 0,"+t+" -"+t+",0 0,-"+t+"z ",f+='>>8),r.push(255&o)):r.push(a)}}return r}};var a=1,u=2,o=4,f=8,y={L:1,M:0,Q:3,H:2},n=0,c=1,l=2,s=3,g=4,h=5,v=6,d=7,w=function(){function e(t){for(var r=0;0!=t;)r+=1,t>>>=1;return r}var r=[[],[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]],t={};return t.getBCHTypeInfo=function(t){for(var r=t<<10;0<=e(r)-e(1335);)r^=1335<>>8)},writeBytes:function(t,r,e){r=r||0,e=e||t.length;for(var n=0;n>>7-t%8&1)},put:function(t,r){for(var e=0;e>>r-e-1&1))},getLengthInBits:function(){return n},putBit:function(t){var r=Math.floor(n/8);e.length<=r&&e.push(0),t&&(e[r]|=128>>>n%8),n+=1}};return o},x=function(t){var r=a,n=t,e={getMode:function(){return r},getLength:function(t){return n.length},write:function(t){for(var r=n,e=0;e+2>>8&255)+(255&n),t.put(n,13),e+=2}if(e=e.length){if(0==i)return-1;throw"unexpected end of file./"+i}var t=e.charAt(n);if(n+=1,"="==t)return i=0,-1;t.match(/^\s$/)||(o=o<<6|a(t.charCodeAt(0)),i+=6)}var r=o>>>i-8&255;return i-=8,r}},a=function(t){if(65<=t&&t<=90)return t-65;if(97<=t&&t<=122)return t-97+26;if(48<=t&&t<=57)return t-48+52;if(43==t)return 62;if(47==t)return 63;throw"c:"+t};return r},D=function(t,r,e){for(var n=function(t,r){var n=t,o=r,s=new Array(t*r),e={setPixel:function(t,r,e){s[r*n+t]=e},write:function(t){t.writeString("GIF87a"),t.writeShort(n),t.writeShort(o),t.writeByte(128),t.writeByte(0),t.writeByte(0),t.writeByte(0),t.writeByte(0),t.writeByte(0),t.writeByte(255),t.writeByte(255),t.writeByte(255),t.writeString(","),t.writeShort(0),t.writeShort(0),t.writeShort(n),t.writeShort(o),t.writeByte(0);var r=i(2);t.writeByte(2);for(var e=0;255>>r!=0)throw"length over";for(;8<=n+r;)e.writeByte(255&(t<>>=8-n,n=o=0;o|=t<>>o-6),o-=6},t.flush=function(){if(0>6,128|63&n):n<55296||57344<=n?r.push(224|n>>12,128|n>>6&63,128|63&n):(e++,n=65536+((1023&n)<<10|1023&t.charCodeAt(e)),r.push(240|n>>18,128|n>>12&63,128|n>>6&63,128|63&n))}return r}(t)},o=[],void 0===(i="function"==typeof(n=function(){return a})?n.apply(r,o):n)||(t.exports=i)},function(t,r,e){function c(t,r,e,n,o,i){t.isDark(o,i)&&r.rect(i*n,o*n,n,n)}var l=e(7),n=e(8);t.exports=function(t,r,e){!function(t,r){t.fillStyle=r.back,t.fillRect(0,0,r.size,r.size)}(r,e),function(t,r,e){if(t){var n=0 output", use the full "function() {return output;}" style + * - IE doesn't support: + * - URL(), use the traditional window.location object + * - endsWith(), use indexof() + * - yes, this logic needs to support IE 6, to at least display the error message + */ + +'use strict'; +(function() { + /** + * compatibility check + * + * @name Check + * @class + */ + var Check = (function () { + var me = {}; + + /** + * Status of the initial check, true means it passed + * + * @private + * @prop {bool} + */ + var status = false; + + /** + * Initialization check did run + * + * @private + * @prop {bool} + */ + var init = false; + + /** + * blacklist of UserAgents (parts) known to belong to a bot + * + * @private + * @enum {Array} + * @readonly + */ + var badBotUA = [ + 'Bot', + 'bot' + ]; + + /** + * whitelist of top level domains to consider a secure context, + * regardless of protocol + * + * @private + * @enum {Array} + * @readonly + */ + var tld = [ + '.onion', + '.i2p' + ]; + + /** + * whitelist of hostnames to consider a secure context, + * regardless of protocol + * + * @private + * @enum {Array} + * @readonly + */ + // whitelists of TLDs & local hostnames + var hostname = [ + 'localhost', + '127.0.0.1', + '[::1]' + ]; + + /** + * check if the context is secure + * + * @private + * @name Check.isSecureContext + * @function + * @return {bool} + */ + function isSecureContext() + { + // use .isSecureContext if available + if (window.isSecureContext === true || window.isSecureContext === false) { + return window.isSecureContext; + } + + // HTTP is obviously insecure + if (window.location.protocol !== 'http:') { + return true; + } + + // filter out actually secure connections over HTTP + for (var i = 0; i < tld.length; i++) { + if ( + window.location.hostname.indexOf( + tld[i], + window.location.hostname.length - tld[i].length + ) !== -1 + ) { + return true; + } + } + + // whitelist localhost for development + for (var j = 0; j < hostname.length; j++) { + if (window.location.hostname === hostname[j]) { + return true; + } + } + + // totally INSECURE http protocol! + return false; + } + + /** + * checks whether this is a bot we dislike + * + * @private + * @name Check.isBadBot + * @function + * @return {bool} + */ + function isBadBot() { + // check whether a bot user agent part can be found in the current + // user agent + for (var i = 0; i < badBotUA.length; i++) { + if (navigator.userAgent.indexOf(badBotUA[i]) !== -1) { + return true; + } + } + return false; + } + + /** + * checks whether this is an unsupported browser, via feature detection + * + * @private + * @name Check.isOldBrowser + * @function + * @return {bool} + */ + function isOldBrowser() { + // webcrypto support + if (!( + 'crypto' in window && + 'getRandomValues' in window.crypto && + 'subtle' in window.crypto && + 'encrypt' in window.crypto.subtle && + 'decrypt' in window.crypto.subtle && + 'Uint8Array' in window && + 'Uint32Array' in window + )) { + return true; + } + + // async & ES6 support + try { + eval('async () => {}'); + } catch (e) { + if (e instanceof SyntaxError) { + return true; + } else { + throw e; // throws CSP error + } + } + + return false; + } + + /** + * shows an error message + * + * @private + * @name Check.showError + * @param {string} message + * @function + */ + function showError(message) + { + var element = document.getElementById('errormessage'); + if (message.indexOf('=c?parseInt(e.substring(1),8):"u"===c||"x"===c?parseInt(e.substring(2),16):e.charCodeAt(1)}function f(e){if(32>e)return(16>e?"\\x0":"\\x")+e.toString(16);e=String.fromCharCode(e);return"\\"===e||"-"===e||"]"===e||"^"===e?"\\"+e:e}function c(e){var c=e.substring(1,e.length-1).match(RegExp("\\\\u[0-9A-Fa-f]{4}|\\\\x[0-9A-Fa-f]{2}|\\\\[0-3][0-7]{0,2}|\\\\[0-7]{1,2}|\\\\[\\s\\S]|-|[^-\\\\]","g")); +e=[];var a="^"===c[0],b=["["];a&&b.push("^");for(var a=a?1:0,g=c.length;ak||122k||90k||122h[0]&&(h[1]+1>h[0]&&b.push("-"),b.push(f(h[1])));b.push("]");return b.join("")}function m(e){for(var a=e.source.match(RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g")),b=a.length,d=[],g=0,h=0;g/,null])):d.push(["com",/^#[^\r\n]*/,null,"#"]));a.cStyleComments&&(f.push(["com",/^\/\/[^\r\n]*/,null]),f.push(["com",/^\/\*[\s\S]*?(?:\*\/|$)/,null]));if(c=a.regexLiterals){var m=(c=1|\\/=?|::?|<>?>?=?|,|;|\\?|@|\\[|~|{|\\^\\^?=?|\\|\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*("+ +("/(?=[^/*"+c+"])(?:[^/\\x5B\\x5C"+c+"]|\\x5C"+m+"|\\x5B(?:[^\\x5C\\x5D"+c+"]|\\x5C"+m+")*(?:\\x5D|$))+/")+")")])}(c=a.types)&&f.push(["typ",c]);c=(""+a.keywords).replace(/^ | $/g,"");c.length&&f.push(["kwd",new RegExp("^(?:"+c.replace(/[\s,]+/g,"|")+")\\b"),null]);d.push(["pln",/^\s+/,null," \r\n\t\u00a0"]);c="^.[^\\s\\w.$@'\"`/\\\\]*";a.regexLiterals&&(c+="(?!s*/)");f.push(["lit",/^@[a-z_$][a-z_$@0-9]*/i,null],["typ",/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],["pln",/^[a-z_$][a-z_$@0-9]*/i, +null],["lit",/^(?:0x[a-f0-9]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+\-]?\d+)?)[a-z]*/i,null,"0123456789"],["pln",/^\\[\s\S]?/,null],["pun",new RegExp(c),null]);return G(d,f)}function L(a,d,f){function c(a){var b=a.nodeType;if(1==b&&!t.test(a.className))if("br"===a.nodeName.toLowerCase())m(a),a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)c(a);else if((3==b||4==b)&&f){var e=a.nodeValue,d=e.match(q);d&&(b=e.substring(0,d.index),a.nodeValue=b,(e=e.substring(d.index+ +d[0].length))&&a.parentNode.insertBefore(l.createTextNode(e),a.nextSibling),m(a),b||a.parentNode.removeChild(a))}}function m(a){function c(a,b){var e=b?a.cloneNode(!1):a,k=a.parentNode;if(k){var k=c(k,1),d=a.nextSibling;k.appendChild(e);for(var f=d;f;f=d)d=f.nextSibling,k.appendChild(f)}return e}for(;!a.nextSibling;)if(a=a.parentNode,!a)return;a=c(a.nextSibling,0);for(var e;(e=a.parentNode)&&1===e.nodeType;)a=e;b.push(a)}for(var t=/(?:^|\s)nocode(?:\s|$)/,q=/\r\n?|\n/,l=a.ownerDocument,n=l.createElement("li");a.firstChild;)n.appendChild(a.firstChild); +for(var b=[n],p=0;p=+m[1],d=/\n/g,t=a.a,q=t.length,f=0,l=a.c,n=l.length,c=0,b=a.g,p=b.length,w=0;b[p]=q;var r,e;for(e=r=0;e=h&&(c+=2);f>=k&&(w+=2)}}finally{g&&(g.style.display=a)}}catch(y){D.console&&console.log(y&&y.stack||y)}}var D="undefined"!==typeof window? +window:{},B=["break,continue,do,else,for,if,return,while"],F=[[B,"auto,case,char,const,default,double,enum,extern,float,goto,inline,int,long,register,restrict,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"],"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],H=[F,"alignas,alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,delegate,dynamic_cast,explicit,export,friend,generic,late_check,mutable,namespace,noexcept,noreturn,nullptr,property,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"], +O=[F,"abstract,assert,boolean,byte,extends,finally,final,implements,import,instanceof,interface,null,native,package,strictfp,super,synchronized,throws,transient"],P=[F,"abstract,add,alias,as,ascending,async,await,base,bool,by,byte,checked,decimal,delegate,descending,dynamic,event,finally,fixed,foreach,from,get,global,group,implicit,in,interface,internal,into,is,join,let,lock,null,object,out,override,orderby,params,partial,readonly,ref,remove,sbyte,sealed,select,set,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,value,var,virtual,where,yield"], +F=[F,"abstract,async,await,constructor,debugger,enum,eval,export,from,function,get,import,implements,instanceof,interface,let,null,of,set,undefined,var,with,yield,Infinity,NaN"],Q=[B,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"],R=[B,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"], +B=[B,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],S=/^(DIR|FILE|array|vector|(de|priority_)?queue|(forward_)?list|stack|(const_)?(reverse_)?iterator|(unordered_)?(multi)?(set|map)|bitset|u?(int|float)\d*)\b/,W=/\S/,X=x({keywords:[H,P,O,F,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",Q,R,B],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}), +I={};t(X,["default-code"]);t(G([],[["pln",/^[^]*(?:>|$)/],["com",/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),"default-markup htm html mxml xhtml xml xsl".split(" "));t(G([["pln",/^[\s]+/, +null," \t\r\n"],["atv",/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],["pun",/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]); +t(G([],[["atv",/^[\s\S]+/]]),["uq.val"]);t(x({keywords:H,hashComments:!0,cStyleComments:!0,types:S}),"c cc cpp cxx cyc m".split(" "));t(x({keywords:"null,true,false"}),["json"]);t(x({keywords:P,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:S}),["cs"]);t(x({keywords:O,cStyleComments:!0}),["java"]);t(x({keywords:B,hashComments:!0,multiLineStrings:!0}),["bash","bsh","csh","sh"]);t(x({keywords:Q,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),["cv","py","python"]);t(x({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END", +hashComments:!0,multiLineStrings:!0,regexLiterals:2}),["perl","pl","pm"]);t(x({keywords:R,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb","ruby"]);t(x({keywords:F,cStyleComments:!0,regexLiterals:!0}),["javascript","js","ts","typescript"]);t(x({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,throw,true,try,unless,until,when,while,yes",hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0, +regexLiterals:!0}),["coffee"]);t(G([],[["str",/^[\s\S]+/]]),["regex"]);var Y=D.PR={createSimpleLexer:G,registerLangHandler:t,sourceDecorator:x,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit",PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ",prettyPrintOne:D.prettyPrintOne=function(a,d,f){f=f||!1;d=d||null;var c=document.createElement("div");c.innerHTML="
"+a+"
"; +c=c.firstChild;f&&L(c,f,!0);M({j:d,m:f,h:c,l:1,a:null,i:null,c:null,g:null});return c.innerHTML},prettyPrint:D.prettyPrint=function(a,d){function f(){for(var c=D.PR_SHOULD_USE_CONTINUATION?b.now()+250:Infinity;p + * magnet:?xt.1=urn:sha1:YNCKHTQCWBTRNJIV4WNAE52SJUQCZO5C&xt.2=urn:sha1:TXGCZQTH26NL6OUQAJJPFALHG2LTGBC7 + * https://example.com:8800/zero/?6f09182b8ea51997#WtLEUO5Epj9UHAV9JFs+6pUQZp13TuspAUjnF+iM+dM= + * http://user:example.com@localhost:8800/zero/?6f09182b8ea51997#WtLEUO5Epj9UHAV9JFs+6pUQZp13TuspAUjnF+iM+dM= + * + * + * @name Helper.urls2links + * @function + * @param {string} html + * @return {string} + */ + me.urls2links = function(html) + { + return html.replace( + /(((https?|ftp):\/\/[\w?!=&.\/-;#@~%+*-]+(?![\w\s?!&.\/;#~%"=-]*>))|((magnet):[\w?=&.\/-;#@~%+*-]+))/ig, + '$1' + ); + }; + + /** + * minimal sprintf emulation for %s and %d formats + * + * Note that this function needs the parameters in the same order as the + * format strings appear in the string, contrary to the original. + * + * @see {@link https://stackoverflow.com/questions/610406/javascript-equivalent-to-printf-string-format#4795914} + * @name Helper.sprintf + * @function + * @param {string} format + * @param {...*} args - one or multiple parameters injected into format string + * @return {string} + */ + me.sprintf = function() + { + const args = Array.prototype.slice.call(arguments); + let format = args[0], + i = 1; + return format.replace(/%(s|d)/g, function (m) { + // m is the matched format, e.g. %s, %d + let val = args[i]; + // A switch statement so that the formatter can be extended. + switch (m) + { + case '%d': + val = parseFloat(val); + if (isNaN(val)) { + val = 0; + } + break; + default: + // Default is %s + } + ++i; + return val; + }); + }; + + /** + * get value of cookie, if it was set, empty string otherwise + * + * @see {@link http://www.w3schools.com/js/js_cookies.asp} + * @name Helper.getCookie + * @function + * @param {string} cname - may not be empty + * @return {string} + */ + me.getCookie = function(cname) { + const name = cname + '=', + ca = document.cookie.split(';'); + for (let i = 0; i < ca.length; ++i) { + let c = ca[i]; + while (c.charAt(0) === ' ') + { + c = c.substring(1); + } + if (c.indexOf(name) === 0) + { + return c.substring(name.length, c.length); + } + } + return ''; + }; + + /** + * get the current location (without search or hash part of the URL), + * eg. https://example.com/path/?aaaa#bbbb --> https://example.com/path/ + * + * @name Helper.baseUri + * @function + * @return {string} + */ + me.baseUri = function() + { + // check for cached version + if (baseUri !== null) { + return baseUri; + } + + baseUri = window.location.origin + window.location.pathname; + return baseUri; + }; + + /** + * wrap an object into a Paste, used for mocking in the unit tests + * + * @name Helper.PasteFactory + * @function + * @param {object} data + * @return {Paste} + */ + me.PasteFactory = function(data) + { + return new Paste(data); + }; + + /** + * wrap an object into a Comment, used for mocking in the unit tests + * + * @name Helper.CommentFactory + * @function + * @param {object} data + * @return {Comment} + */ + me.CommentFactory = function(data) + { + return new Comment(data); + }; + + /** + * resets state, used for unit testing + * + * @name Helper.reset + * @function + */ + me.reset = function() + { + baseUri = null; + }; + + /** + * calculate expiration date given initial date and expiration period + * + * @name Helper.calculateExpirationDate + * @function + * @param {Date} initialDate - may not be empty + * @param {string|number} expirationDisplayStringOrSecondsToExpire - may not be empty + * @return {Date} + */ + me.calculateExpirationDate = function(initialDate, expirationDisplayStringOrSecondsToExpire) { + let expirationDate = new Date(initialDate); + + const expirationDisplayStringToSecondsDict = { + '5min': 300, + '10min': 600, + '1hour': 3500, + '1day': 86400, + '1week': 604800, + '1month': 2592000, + '1year': 31536000, + 'never': 0 + }; + + let secondsToExpiration = expirationDisplayStringOrSecondsToExpire; + if (typeof expirationDisplayStringOrSecondsToExpire === 'string') { + secondsToExpiration = expirationDisplayStringToSecondsDict[expirationDisplayStringOrSecondsToExpire]; + } + + if (typeof secondsToExpiration !== 'number') { + throw new Error('Cannot calculate expiration date.'); + } + if (secondsToExpiration === 0) { + return null; + } + + expirationDate = expirationDate.setUTCSeconds(expirationDate.getUTCSeconds() + secondsToExpiration); + return expirationDate; + }; + + /** + * encode all applicable characters to HTML entities + * + * @see {@link https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html} + * + * @name Helper.htmlEntities + * @function + * @param string str + * @return string escaped HTML + */ + me.htmlEntities = function(str) { + // using textarea, since other tags may allow and execute scripts, even when detached from DOM + let holder = document.createElement('textarea'); + holder.textContent = str; + // as per OWASP recommendation, also encoding quotes and slash + return holder.innerHTML.replace( + /["'\/]/g, + function(s) { + return { + '"': '"', + "'": ''', + '/': '/' + }[s]; + }); + }; + + return me; + })(); + + /** + * internationalization module + * + * @name I18n + * @class + */ + const I18n = (function () { + const me = {}; + + /** + * const for string of loaded language + * + * @name I18n.languageLoadedEvent + * @private + * @prop {string} + * @readonly + */ + const languageLoadedEvent = 'languageLoaded'; + + /** + * supported languages, minus the built in 'en' + * + * @name I18n.supportedLanguages + * @private + * @prop {string[]} + * @readonly + */ + const supportedLanguages = ['bg', 'cs', 'de', 'es', 'fr', 'it', 'hu', 'no', 'nl', 'pl', 'pt', 'oc', 'ru', 'sl', 'uk', 'zh']; + + /** + * built in language + * + * @name I18n.language + * @private + * @prop {string|null} + */ + let language = null; + + /** + * translation cache + * + * @name I18n.translations + * @private + * @enum {Object} + */ + let translations = {}; + + /** + * translate a string, alias for I18n.translate + * + * @name I18n._ + * @function + * @param {jQuery} $element - optional + * @param {string} messageId + * @param {...*} args - one or multiple parameters injected into placeholders + * @return {string} + */ + me._ = function() + { + return me.translate.apply(this, arguments); + }; + + /** + * translate a string + * + * Optionally pass a jQuery element as the first parameter, to automatically + * let the text of this element be replaced. In case the (asynchronously + * loaded) language is not downloadet yet, this will make sure the string + * is replaced when it is actually loaded. + * So for easy translations passing the jQuery object to apply it to is + * more save, especially when they are loaded in the beginning. + * + * @name I18n.translate + * @function + * @param {jQuery} $element - optional + * @param {string} messageId + * @param {...*} args - one or multiple parameters injected into placeholders + * @return {string} + */ + me.translate = function() + { + // convert parameters to array + let args = Array.prototype.slice.call(arguments), + messageId, + $element = null; + + // parse arguments + if (args[0] instanceof jQuery) { + // optional jQuery element as first parameter + $element = args[0]; + args.shift(); + } + + // extract messageId from arguments + let usesPlurals = $.isArray(args[0]); + if (usesPlurals) { + // use the first plural form as messageId, otherwise the singular + messageId = args[0].length > 1 ? args[0][1] : args[0][0]; + } else { + messageId = args[0]; + } + + if (messageId.length === 0) { + return messageId; + } + + // if no translation string cannot be found (in translations object) + if (!translations.hasOwnProperty(messageId) || language === null) { + // if language is still loading and we have an elemt assigned + if (language === null && $element !== null) { + // handle the error by attaching the language loaded event + let orgArguments = arguments; + $(document).on(languageLoadedEvent, function () { + // re-execute this function + me.translate.apply(this, orgArguments); + }); + + // and fall back to English for now until the real language + // file is loaded + } + + // for all other languages than English for which this behaviour + // is expected as it is built-in, log error + if (language !== null && language !== 'en') { + console.error('Missing translation for: \'' + messageId + '\' in language ' + language); + // fallback to English + } + + // save English translation (should be the same on both sides) + translations[messageId] = args[0]; + } + + // lookup plural translation + if (usesPlurals && $.isArray(translations[messageId])) { + let n = parseInt(args[1] || 1, 10), + key = me.getPluralForm(n), + maxKey = translations[messageId].length - 1; + if (key > maxKey) { + key = maxKey; + } + args[0] = translations[messageId][key]; + args[1] = n; + } else { + // lookup singular translation + args[0] = translations[messageId]; + } + + // messageID may contain links, but should be from a trusted source (code or translation JSON files) + let containsNoLinks = args[0].indexOf(' 0) may never contain HTML as they may come from untrusted parties + if (i > 0 || containsNoLinks) { + args[i] = Helper.htmlEntities(args[i]); + } + } + + // format string + let output = Helper.sprintf.apply(this, args); + + // if $element is given, apply text to element + if ($element !== null) { + if (containsNoLinks) { + // avoid HTML entity encoding if translation contains links + $element.text(output); + } else { + // only allow tags/attributes we actually use in our translations + $element.html( + DOMPurify.sanitize(output, { + ALLOWED_TAGS: ['a', 'br', 'i', 'span'], + ALLOWED_ATTR: ['href', 'id'] + }) + ); + } + } + + return output; + }; + + /** + * per language functions to use to determine the plural form + * + * @see {@link http://localization-guide.readthedocs.org/en/latest/l10n/pluralforms.html} + * @name I18n.getPluralForm + * @function + * @param {int} n + * @return {int} array key + */ + me.getPluralForm = function(n) { + switch (language) + { + case 'cs': + return n === 1 ? 0 : (n >= 2 && n <=4 ? 1 : 2); + case 'fr': + case 'oc': + case 'zh': + return n > 1 ? 1 : 0; + case 'pl': + return n === 1 ? 0 : (n % 10 >= 2 && n %10 <=4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2); + case 'ru': + case 'uk': + return n % 10 === 1 && n % 100 !== 11 ? 0 : (n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2); + case 'sl': + return n % 100 === 1 ? 1 : (n % 100 === 2 ? 2 : (n % 100 === 3 || n % 100 === 4 ? 3 : 0)); + // bg, de, en, es, hu, it, nl, no, pt + default: + return n !== 1 ? 1 : 0; + } + }; + + /** + * load translations into cache + * + * @name I18n.loadTranslations + * @function + */ + me.loadTranslations = function() + { + let newLanguage = Helper.getCookie('lang'); + + // auto-select language based on browser settings + if (newLanguage.length === 0) { + newLanguage = (navigator.language || navigator.userLanguage || 'en').substring(0, 2); + } + + // if language is already used skip update + if (newLanguage === language) { + return; + } + + // if language is built-in (English) skip update + if (newLanguage === 'en') { + language = 'en'; + return; + } + + // if language is not supported, show error + if (supportedLanguages.indexOf(newLanguage) === -1) { + console.error('Language \'%s\' is not supported. Translation failed, fallback to English.', newLanguage); + language = 'en'; + return; + } + + // load strings from JSON + $.getJSON('i18n/' + newLanguage + '.json', function(data) { + language = newLanguage; + translations = data; + $(document).triggerHandler(languageLoadedEvent); + }).fail(function (data, textStatus, errorMsg) { + console.error('Language \'%s\' could not be loaded (%s: %s). Translation failed, fallback to English.', newLanguage, textStatus, errorMsg); + language = 'en'; + }); + }; + + /** + * resets state, used for unit testing + * + * @name I18n.reset + * @function + */ + me.reset = function(mockLanguage, mockTranslations) + { + language = mockLanguage || null; + translations = mockTranslations || {}; + }; + + return me; + })(); + + /** + * handles everything related to en/decryption + * + * @name CryptTool + * @class + */ + const CryptTool = (function () { + const me = {}; + + /** + * base58 encoder & decoder + * + * @private + */ + let base58 = new baseX('123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'); + + /** + * convert UTF-8 string stored in a DOMString to a standard UTF-16 DOMString + * + * Iterates over the bytes of the message, converting them all hexadecimal + * percent encoded representations, then URI decodes them all + * + * @name CryptTool.utf8To16 + * @function + * @private + * @param {string} message UTF-8 string + * @return {string} UTF-16 string + */ + function utf8To16(message) + { + return decodeURIComponent( + message.split('').map( + function(character) + { + return '%' + ('00' + character.charCodeAt(0).toString(16)).slice(-2); + } + ).join('') + ); + } + + /** + * convert DOMString (UTF-16) to a UTF-8 string stored in a DOMString + * + * URI encodes the message, then finds the percent encoded characters + * and transforms these hexadecimal representation back into bytes + * + * @name CryptTool.utf16To8 + * @function + * @private + * @param {string} message UTF-16 string + * @return {string} UTF-8 string + */ + function utf16To8(message) + { + return encodeURIComponent(message).replace( + /%([0-9A-F]{2})/g, + function (match, hexCharacter) + { + return String.fromCharCode('0x' + hexCharacter); + } + ); + } + + /** + * convert ArrayBuffer into a UTF-8 string + * + * Iterates over the bytes of the array, catenating them into a string + * + * @name CryptTool.arraybufferToString + * @function + * @private + * @param {ArrayBuffer} messageArray + * @return {string} message + */ + function arraybufferToString(messageArray) + { + const array = new Uint8Array(messageArray); + let message = '', + i = 0; + while(i < array.length) { + message += String.fromCharCode(array[i++]); + } + return message; + } + + /** + * convert UTF-8 string into a Uint8Array + * + * Iterates over the bytes of the message, writing them to the array + * + * @name CryptTool.stringToArraybuffer + * @function + * @private + * @param {string} message UTF-8 string + * @return {Uint8Array} array + */ + function stringToArraybuffer(message) + { + const messageArray = new Uint8Array(message.length); + for (let i = 0; i < message.length; ++i) { + messageArray[i] = message.charCodeAt(i); + } + return messageArray; + } + + /** + * compress a string (deflate compression), returns buffer + * + * @name CryptTool.compress + * @async + * @function + * @private + * @param {string} message + * @param {string} mode + * @param {object} zlib + * @throws {string} + * @return {ArrayBuffer} data + */ + async function compress(message, mode, zlib) + { + message = stringToArraybuffer( + utf16To8(message) + ); + if (mode === 'zlib') { + if (typeof zlib === 'undefined') { + throw 'Error compressing paste, due to missing WebAssembly support.' + } + return zlib.deflate(message).buffer; + } + return message; + } + + /** + * decompress potentially base64 encoded, deflate compressed buffer, returns string + * + * @name CryptTool.decompress + * @async + * @function + * @private + * @param {ArrayBuffer} data + * @param {string} mode + * @param {object} zlib + * @throws {string} + * @return {string} message + */ + async function decompress(data, mode, zlib) + { + if (mode === 'zlib' || mode === 'none') { + if (mode === 'zlib') { + if (typeof zlib === 'undefined') { + throw 'Error decompressing paste, due to missing WebAssembly support.' + } + data = zlib.inflate( + new Uint8Array(data) + ).buffer; + } + return utf8To16( + arraybufferToString(data) + ); + } + // detect presence of Base64.js, indicating legacy ZeroBin paste + if (typeof Base64 === 'undefined') { + return utf8To16( + RawDeflate.inflate( + utf8To16( + atob( + arraybufferToString(data) + ) + ) + ) + ); + } else { + return Base64.btou( + RawDeflate.inflate( + Base64.fromBase64( + arraybufferToString(data) + ) + ) + ); + } + } + + /** + * returns specified number of random bytes + * + * @name CryptTool.getRandomBytes + * @function + * @private + * @param {int} length number of random bytes to fetch + * @throws {string} + * @return {string} random bytes + */ + function getRandomBytes(length) + { + let bytes = ''; + const byteArray = new Uint8Array(length); + window.crypto.getRandomValues(byteArray); + for (let i = 0; i < length; ++i) { + bytes += String.fromCharCode(byteArray[i]); + } + return bytes; + } + + /** + * derive cryptographic key from key string and password + * + * @name CryptTool.deriveKey + * @async + * @function + * @private + * @param {string} key + * @param {string} password + * @param {array} spec cryptographic specification + * @return {CryptoKey} derived key + */ + async function deriveKey(key, password, spec) + { + let keyArray = stringToArraybuffer(key); + if (password.length > 0) { + // version 1 pastes did append the passwords SHA-256 hash in hex + if (spec[7] === 'rawdeflate') { + let passwordBuffer = await window.crypto.subtle.digest( + {name: 'SHA-256'}, + stringToArraybuffer( + utf16To8(password) + ) + ).catch(Alert.showError); + password = Array.prototype.map.call( + new Uint8Array(passwordBuffer), + x => ('00' + x.toString(16)).slice(-2) + ).join(''); + } + let passwordArray = stringToArraybuffer(password), + newKeyArray = new Uint8Array(keyArray.length + passwordArray.length); + newKeyArray.set(keyArray, 0); + newKeyArray.set(passwordArray, keyArray.length); + keyArray = newKeyArray; + } + + // import raw key + const importedKey = await window.crypto.subtle.importKey( + 'raw', // only 'raw' is allowed + keyArray, + {name: 'PBKDF2'}, // we use PBKDF2 for key derivation + false, // the key may not be exported + ['deriveKey'] // we may only use it for key derivation + ).catch(Alert.showError); + + // derive a stronger key for use with AES + return window.crypto.subtle.deriveKey( + { + name: 'PBKDF2', // we use PBKDF2 for key derivation + salt: stringToArraybuffer(spec[1]), // salt used in HMAC + iterations: spec[2], // amount of iterations to apply + hash: {name: 'SHA-256'} // can be "SHA-1", "SHA-256", "SHA-384" or "SHA-512" + }, + importedKey, + { + name: 'AES-' + spec[6].toUpperCase(), // can be any supported AES algorithm ("AES-CTR", "AES-CBC", "AES-CMAC", "AES-GCM", "AES-CFB", "AES-KW", "ECDH", "DH" or "HMAC") + length: spec[3] // can be 128, 192 or 256 + }, + false, // the key may not be exported + ['encrypt', 'decrypt'] // we may only use it for en- and decryption + ).catch(Alert.showError); + } + + /** + * gets crypto settings from specification and authenticated data + * + * @name CryptTool.cryptoSettings + * @function + * @private + * @param {string} adata authenticated data + * @param {array} spec cryptographic specification + * @return {object} crypto settings + */ + function cryptoSettings(adata, spec) + { + return { + name: 'AES-' + spec[6].toUpperCase(), // can be any supported AES algorithm ("AES-CTR", "AES-CBC", "AES-CMAC", "AES-GCM", "AES-CFB", "AES-KW", "ECDH", "DH" or "HMAC") + iv: stringToArraybuffer(spec[0]), // the initialization vector you used to encrypt + additionalData: stringToArraybuffer(adata), // the addtional data you used during encryption (if any) + tagLength: spec[4] // the length of the tag you used to encrypt (if any) + }; + } + + /** + * compress, then encrypt message with given key and password + * + * @name CryptTool.cipher + * @async + * @function + * @param {string} key + * @param {string} password + * @param {string} message + * @param {array} adata + * @return {array} encrypted message in base64 encoding & adata containing encryption spec + */ + me.cipher = async function(key, password, message, adata) + { + let zlib = (await z); + // AES in Galois Counter Mode, keysize 256 bit, + // authentication tag 128 bit, 10000 iterations in key derivation + const compression = ( + typeof zlib === 'undefined' ? + 'none' : // client lacks support for WASM + ($('body').data('compression') || 'zlib') + ), + spec = [ + getRandomBytes(16), // initialization vector + getRandomBytes(8), // salt + 100000, // iterations + 256, // key size + 128, // tag size + 'aes', // algorithm + 'gcm', // algorithm mode + compression // compression + ], encodedSpec = []; + for (let i = 0; i < spec.length; ++i) { + encodedSpec[i] = i < 2 ? btoa(spec[i]) : spec[i]; + } + if (adata.length === 0) { + // comment + adata = encodedSpec; + } else if (adata[0] === null) { + // paste + adata[0] = encodedSpec; + } + + // finally, encrypt message + return [ + btoa( + arraybufferToString( + await window.crypto.subtle.encrypt( + cryptoSettings(JSON.stringify(adata), spec), + await deriveKey(key, password, spec), + await compress(message, compression, zlib) + ).catch(Alert.showError) + ) + ), + adata + ]; + }; + + /** + * decrypt message with key, then decompress + * + * @name CryptTool.decipher + * @async + * @function + * @param {string} key + * @param {string} password + * @param {string|object} data encrypted message + * @return {string} decrypted message, empty if decryption failed + */ + me.decipher = async function(key, password, data) + { + let adataString, spec, cipherMessage, plaintext; + let zlib = (await z); + if (data instanceof Array) { + // version 2 + adataString = JSON.stringify(data[1]); + // clone the array instead of passing the reference + spec = (data[1][0] instanceof Array ? data[1][0] : data[1]).slice(); + cipherMessage = data[0]; + } else if (typeof data === 'string') { + // version 1 + let object = JSON.parse(data); + adataString = atob(object.adata); + spec = [ + object.iv, + object.salt, + object.iter, + object.ks, + object.ts, + object.cipher, + object.mode, + 'rawdeflate' + ]; + cipherMessage = object.ct; + } else { + throw 'unsupported message format'; + } + spec[0] = atob(spec[0]); + spec[1] = atob(spec[1]); + if (spec[7] === 'zlib') { + if (typeof zlib === 'undefined') { + throw 'Error decompressing paste, due to missing WebAssembly support.' + } + } + try { + plaintext = await window.crypto.subtle.decrypt( + cryptoSettings(adataString, spec), + await deriveKey(key, password, spec), + stringToArraybuffer( + atob(cipherMessage) + ) + ); + } catch(err) { + console.error(err); + return ''; + } + try { + return await decompress(plaintext, spec[7], zlib); + } catch(err) { + Alert.showError(err); + return err; + } + }; + + /** + * returns a random symmetric key + * + * generates 256 bit long keys (8 Bits * 32) for AES with 256 bit long blocks + * + * @name CryptTool.getSymmetricKey + * @function + * @throws {string} + * @return {string} raw bytes + */ + me.getSymmetricKey = function() + { + return getRandomBytes(32); + }; + + /** + * base58 encode a DOMString (UTF-16) + * + * @name CryptTool.base58encode + * @function + * @param {string} input + * @return {string} output + */ + me.base58encode = function(input) + { + return base58.encode( + stringToArraybuffer(input) + ); + } + + /** + * base58 decode a DOMString (UTF-16) + * + * @name CryptTool.base58decode + * @function + * @param {string} input + * @return {string} output + */ + me.base58decode = function(input) + { + return arraybufferToString( + base58.decode(input) + ); + } + + return me; + })(); + + /** + * (Model) Data source (aka MVC) + * + * @name Model + * @class + */ + const Model = (function () { + const me = {}; + + let id = null, + pasteData = null, + symmetricKey = null, + $templates; + + /** + * returns the expiration set in the HTML + * + * @name Model.getExpirationDefault + * @function + * @return string + */ + me.getExpirationDefault = function() + { + return $('#pasteExpiration').val(); + }; + + /** + * returns the format set in the HTML + * + * @name Model.getFormatDefault + * @function + * @return string + */ + me.getFormatDefault = function() + { + return $('#pasteFormatter').val(); + }; + + /** + * returns the paste data (including the cipher data) + * + * @name Model.getPasteData + * @function + * @param {function} callback (optional) Called when data is available + * @param {function} useCache (optional) Whether to use the cache or + * force a data reload. Default: true + * @return string + */ + me.getPasteData = function(callback, useCache) + { + // use cache if possible/allowed + if (useCache !== false && pasteData !== null) { + //execute callback + if (typeof callback === 'function') { + return callback(pasteData); + } + + // alternatively just using inline + return pasteData; + } + + // reload data + ServerInteraction.prepare(); + ServerInteraction.setUrl(Helper.baseUri() + '?pasteid=' + me.getPasteId()); + + ServerInteraction.setFailure(function (status, data) { + // revert loading status… + Alert.hideLoading(); + TopNav.showViewButtons(); + + // show error message + Alert.showError(ServerInteraction.parseUploadError(status, data, 'get paste data')); + }); + ServerInteraction.setSuccess(function (status, data) { + pasteData = new Paste(data); + + if (typeof callback === 'function') { + return callback(pasteData); + } + }); + ServerInteraction.run(); + }; + + /** + * get the pastes unique identifier from the URL, + * eg. https://example.com/path/?c05354954c49a487#dfdsdgdgdfgdf returns c05354954c49a487 + * + * @name Model.getPasteId + * @function + * @return {string} unique identifier + * @throws {string} + */ + me.getPasteId = function() + { + const idRegEx = /^[a-z0-9]{16}$/; + + // return cached value + if (id !== null) { + return id; + } + + // do use URL interface, if possible + const url = new URL(window.location); + + for (const param of url.searchParams) { + const key = param[0]; + const value = param[1]; + + if (value === '' && idRegEx.test(key)) { + // safe, as the whole regex is matched + id = key; + return key; + } + } + + if (id === null) { + throw 'no paste id given'; + } + + return id; + } + + /** + * returns true, when the URL has a delete token and the current call was used for deleting a paste. + * + * @name Model.hasDeleteToken + * @function + * @return {bool} + */ + me.hasDeleteToken = function() + { + return window.location.search.indexOf('deletetoken') !== -1; + } + + /** + * return the deciphering key stored in anchor part of the URL + * + * @name Model.getPasteKey + * @function + * @return {string|null} key + * @throws {string} + */ + me.getPasteKey = function() + { + if (symmetricKey === null) { + let newKey = window.location.hash.substring(1); + if (newKey === '') { + throw 'no encryption key given'; + } + + // Some web 2.0 services and redirectors add data AFTER the anchor + // (such as &utm_source=...). We will strip any additional data. + let ampersandPos = newKey.indexOf('&'); + if (ampersandPos > -1) + { + newKey = newKey.substring(0, ampersandPos); + } + + // version 2 uses base58, version 1 uses base64 without decoding + try { + // base58 encode strips NULL bytes at the beginning of the + // string, so we re-add them if necessary + symmetricKey = CryptTool.base58decode(newKey).padStart(32, '\u0000'); + } catch(e) { + symmetricKey = newKey; + } + } + + return symmetricKey; + }; + + /** + * returns a jQuery copy of the HTML template + * + * @name Model.getTemplate + * @function + * @param {string} name - the name of the template + * @return {jQuery} + */ + me.getTemplate = function(name) + { + // find template + let $element = $templates.find('#' + name + 'template').clone(true); + // change ID to avoid collisions (one ID should really be unique) + return $element.prop('id', name); + }; + + /** + * resets state, used for unit testing + * + * @name Model.reset + * @function + */ + me.reset = function() + { + pasteData = $templates = id = symmetricKey = null; + }; + + /** + * init navigation manager + * + * preloads jQuery elements + * + * @name Model.init + * @function + */ + me.init = function() + { + $templates = $('#templates'); + }; + + return me; + })(); + + /** + * Helper functions for user interface + * + * everything directly UI-related, which fits nowhere else + * + * @name UiHelper + * @class + */ + const UiHelper = (function () { + const me = {}; + + /** + * handle history (pop) state changes + * + * currently this does only handle redirects to the home page. + * + * @name UiHelper.historyChange + * @private + * @function + * @param {Event} event + */ + function historyChange(event) + { + let currentLocation = Helper.baseUri(); + if (event.originalEvent.state === null && // no state object passed + event.target.location.href === currentLocation && // target location is home page + window.location.href === currentLocation // and we are not already on the home page + ) { + // redirect to home page + window.location.href = currentLocation; + } + } + + /** + * reload the page + * + * This takes the user to the PrivateBin homepage. + * + * @name UiHelper.reloadHome + * @function + */ + me.reloadHome = function() + { + window.location.href = Helper.baseUri(); + }; + + /** + * checks whether the element is currently visible in the viewport (so + * the user can actually see it) + * + * @see {@link https://stackoverflow.com/a/40658647} + * @name UiHelper.isVisible + * @function + * @param {jQuery} $element The link hash to move to. + */ + me.isVisible = function($element) + { + let elementTop = $element.offset().top, + viewportTop = $(window).scrollTop(), + viewportBottom = viewportTop + $(window).height(); + return elementTop > viewportTop && elementTop < viewportBottom; + }; + + /** + * scrolls to a specific element + * + * @see {@link https://stackoverflow.com/questions/4198041/jquery-smooth-scroll-to-an-anchor#answer-12714767} + * @name UiHelper.scrollTo + * @function + * @param {jQuery} $element The link hash to move to. + * @param {(number|string)} animationDuration passed to jQuery .animate, when set to 0 the animation is skipped + * @param {string} animationEffect passed to jQuery .animate + * @param {function} finishedCallback function to call after animation finished + */ + me.scrollTo = function($element, animationDuration, animationEffect, finishedCallback) + { + let $body = $('html, body'), + margin = 50, + callbackCalled = false, + dest = 0; + + // calculate destination place + // if it would scroll out of the screen at the bottom only scroll it as + // far as the screen can go + if ($element.offset().top > $(document).height() - $(window).height()) { + dest = $(document).height() - $(window).height(); + } else { + dest = $element.offset().top - margin; + } + // skip animation if duration is set to 0 + if (animationDuration === 0) { + window.scrollTo(0, dest); + } else { + // stop previous animation + $body.stop(); + // scroll to destination + $body.animate({ + scrollTop: dest + }, animationDuration, animationEffect); + } + + // as we have finished we can enable scrolling again + $body.queue(function (next) { + if (!callbackCalled) { + // call user function if needed + if (typeof finishedCallback !== 'undefined') { + finishedCallback(); + } + + // prevent calling this function twice + callbackCalled = true; + } + next(); + }); + }; + + /** + * trigger a history (pop) state change + * + * used to test the UiHelper.historyChange private function + * + * @name UiHelper.mockHistoryChange + * @function + * @param {string} state (optional) state to mock + */ + me.mockHistoryChange = function(state) + { + if (typeof state === 'undefined') { + state = null; + } + historyChange($.Event('popstate', {originalEvent: new PopStateEvent('popstate', {state: state}), target: window})); + }; + + /** + * initialize + * + * @name UiHelper.init + * @function + */ + me.init = function() + { + // update link to home page + $('.reloadlink').prop('href', Helper.baseUri()); + + $(window).on('popstate', historyChange); + }; + + return me; + })(); + + /** + * Alert/error manager + * + * @name Alert + * @class + */ + const Alert = (function () { + const me = {}; + + let $errorMessage, + $loadingIndicator, + $statusMessage, + $remainingTime, + currentIcon, + customHandler; + + const alertType = [ + 'loading', // not in bootstrap CSS, but using a plausible value here + 'info', // status icon + 'warning', // warning icon + 'danger' // error icon + ]; + + /** + * forwards a request to the i18n module and shows the element + * + * @name Alert.handleNotification + * @private + * @function + * @param {int} id - id of notification + * @param {jQuery} $element - jQuery object + * @param {string|array} args + * @param {string|null} icon - optional, icon + */ + function handleNotification(id, $element, args, icon) + { + // basic parsing/conversion of parameters + if (typeof icon === 'undefined') { + icon = null; + } + if (typeof args === 'undefined') { + args = null; + } else if (typeof args === 'string') { + // convert string to array if needed + args = [args]; + } else if (args instanceof Error) { + // extract message into array if needed + args = [args.message]; + } + + // pass to custom handler if defined + if (typeof customHandler === 'function') { + let handlerResult = customHandler(alertType[id], $element, args, icon); + if (handlerResult === true) { + // if it returns true, skip own handler + return; + } + if (handlerResult instanceof jQuery) { + // continue processing with new element + $element = handlerResult; + icon = null; // icons not supported in this case + } + } + let $translationTarget = $element; + + // handle icon, if template uses one + const $glyphIcon = $element.find(':first'); + if ($glyphIcon.length) { + // if there is an icon, we need to provide an inner element + // to translate the message into, instead of the parent + $translationTarget = $(''); + $element.html(' ').prepend($glyphIcon).append($translationTarget); + + if (icon !== null && // icon was passed + icon !== currentIcon[id] // and it differs from current icon + ) { + // remove (previous) icon + $glyphIcon.removeClass(currentIcon[id]); + + // any other thing as a string (e.g. 'null') (only) removes the icon + if (typeof icon === 'string') { + // set new icon + currentIcon[id] = 'glyphicon-' + icon; + $glyphIcon.addClass(currentIcon[id]); + } + } + } + + // show text + if (args !== null) { + // add jQuery object to it as first parameter + args.unshift($translationTarget); + // pass it to I18n + I18n._.apply(this, args); + } + + // show notification + $element.removeClass('hidden'); + } + + /** + * display a status message + * + * This automatically passes the text to I18n for translation. + * + * @name Alert.showStatus + * @function + * @param {string|array} message string, use an array for %s/%d options + * @param {string|null} icon optional, the icon to show, + * default: leave previous icon + */ + me.showStatus = function(message, icon) + { + handleNotification(1, $statusMessage, message, icon); + }; + + /** + * display a warning message + * + * This automatically passes the text to I18n for translation. + * + * @name Alert.showWarning + * @function + * @param {string|array} message string, use an array for %s/%d options + * @param {string|null} icon optional, the icon to show, default: + * leave previous icon + */ + me.showWarning = function(message, icon) + { + $errorMessage.find(':first') + .removeClass(currentIcon[3]) + .addClass(currentIcon[2]); + handleNotification(2, $errorMessage, message, icon); + }; + + /** + * display an error message + * + * This automatically passes the text to I18n for translation. + * + * @name Alert.showError + * @function + * @param {string|array} message string, use an array for %s/%d options + * @param {string|null} icon optional, the icon to show, default: + * leave previous icon + */ + me.showError = function(message, icon) + { + handleNotification(3, $errorMessage, message, icon); + }; + + /** + * display remaining message + * + * This automatically passes the text to I18n for translation. + * + * @name Alert.showRemaining + * @function + * @param {string|array} message string, use an array for %s/%d options + */ + me.showRemaining = function(message) + { + handleNotification(1, $remainingTime, message); + }; + + /** + * shows a loading message, optionally with a percentage + * + * This automatically passes all texts to the i10s module. + * + * @name Alert.showLoading + * @function + * @param {string|array|null} message optional, use an array for %s/%d options, default: 'Loading…' + * @param {string|null} icon optional, the icon to show, default: leave previous icon + */ + me.showLoading = function(message, icon) + { + // default message text + if (typeof message === 'undefined') { + message = 'Loading…'; + } + + handleNotification(0, $loadingIndicator, message, icon); + + // show loading status (cursor) + $('body').addClass('loading'); + }; + + /** + * hides the loading message + * + * @name Alert.hideLoading + * @function + */ + me.hideLoading = function() + { + $loadingIndicator.addClass('hidden'); + + // hide loading cursor + $('body').removeClass('loading'); + }; + + /** + * hides any status/error messages + * + * This does not include the loading message. + * + * @name Alert.hideMessages + * @function + */ + me.hideMessages = function() + { + $statusMessage.addClass('hidden'); + $errorMessage.addClass('hidden'); + }; + + /** + * set a custom handler, which gets all notifications. + * + * This handler gets the following arguments: + * alertType (see array), $element, args, icon + * If it returns true, the own processing will be stopped so the message + * will not be displayed. Otherwise it will continue. + * As an aditional feature it can return q jQuery element, which will + * then be used to add the message there. Icons are not supported in + * that case and will be ignored. + * Pass 'null' to reset/delete the custom handler. + * Note that there is no notification when a message is supposed to get + * hidden. + * + * @name Alert.setCustomHandler + * @function + * @param {function|null} newHandler + */ + me.setCustomHandler = function(newHandler) + { + customHandler = newHandler; + }; + + /** + * init status manager + * + * preloads jQuery elements + * + * @name Alert.init + * @function + */ + me.init = function() + { + // hide "no javascript" error message + $('#noscript').hide(); + + // not a reset, but first set of the elements + $errorMessage = $('#errormessage'); + $loadingIndicator = $('#loadingindicator'); + $statusMessage = $('#status'); + $remainingTime = $('#remainingtime'); + + currentIcon = [ + 'glyphicon-time', // loading icon + 'glyphicon-info-sign', // status icon + 'glyphicon-warning-sign', // warning icon + 'glyphicon-alert' // error icon + ]; + }; + + return me; + })(); + + /** + * handles paste status/result + * + * @name PasteStatus + * @class + */ + const PasteStatus = (function () { + const me = {}; + + let $pasteSuccess, + $pasteUrl, + $remainingTime, + $shortenButton; + + /** + * forward to URL shortener + * + * @name PasteStatus.sendToShortener + * @private + * @function + */ + function sendToShortener() + { + if ($shortenButton.hasClass('buttondisabled')) { + return; + } + $.ajax({ + type: 'GET', + url: `${$shortenButton.data('shortener')}${encodeURIComponent($pasteUrl.attr('href'))}`, + headers: {'Accept': 'text/html, application/xhtml+xml, application/xml, application/json'}, + processData: false, + timeout: 10000, + xhrFields: { + withCredentials: false + }, + success: function(response) { + let responseString = response; + if (typeof responseString === 'object') { + responseString = JSON.stringify(responseString); + } + if (typeof responseString === 'string' && responseString.length > 0) { + const shortUrlMatcher = /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)/g; + const shortUrl = (responseString.match(shortUrlMatcher) || []).sort(function(a, b) { + return a.length - b.length; + })[0]; + if (typeof shortUrl === 'string' && shortUrl.length > 0) { + $('#pastelink').html( + I18n._( + 'Your paste is %s (Hit [Ctrl]+[c] to copy)', + shortUrl, shortUrl + ) + ); + // we disable the button to avoid calling shortener again + $shortenButton.addClass('buttondisabled'); + // save newly created element + $pasteUrl = $('#pasteurl'); + // we pre-select the link so that the user only has to [Ctrl]+[c] the link + Helper.selectText($pasteUrl[0]); + return; + } + } + Alert.showError('Cannot parse response from URL shortener.'); + } + }) + .fail(function(data, textStatus, errorThrown) { + console.error(textStatus, errorThrown); + // we don't know why it failed, could be CORS of the external + // server not setup properly, in which case we follow old + // behavior to open it in new tab + window.open( + `${$shortenButton.data('shortener')}${encodeURIComponent($pasteUrl.attr('href'))}`, + '_blank', + 'noopener, noreferrer' + ); + }); + } + + /** + * Forces opening the paste if the link does not do this automatically. + * + * This is necessary as browsers will not reload the page when it is + * already loaded (which is fake as it is set via history.pushState()). + * + * @name PasteStatus.pasteLinkClick + * @function + */ + function pasteLinkClick() + { + // check if location is (already) shown in URL bar + if (window.location.href === $pasteUrl.attr('href')) { + // if so we need to load link by reloading the current site + window.location.reload(true); + } + } + + /** + * creates a notification after a successfull paste upload + * + * @name PasteStatus.createPasteNotification + * @function + * @param {string} url + * @param {string} deleteUrl + */ + me.createPasteNotification = function(url, deleteUrl) + { + $('#pastelink').html( + I18n._( + 'Your paste is %s (Hit [Ctrl]+[c] to copy)', + url, url + ) + ); + // save newly created element + $pasteUrl = $('#pasteurl'); + // and add click event + $pasteUrl.click(pasteLinkClick); + + // delete link + $('#deletelink').html('' + I18n._('Delete data') + ''); + + // enable shortener button + $shortenButton.removeClass('buttondisabled'); + + // show result + $pasteSuccess.removeClass('hidden'); + // we pre-select the link so that the user only has to [Ctrl]+[c] the link + Helper.selectText($pasteUrl[0]); + }; + + /** + * shows the remaining time + * + * @name PasteStatus.showRemainingTime + * @function + * @param {Paste} paste + */ + me.showRemainingTime = function(paste) + { + if (paste.isBurnAfterReadingEnabled()) { + // display paste "for your eyes only" if it is deleted + + // the paste has been deleted when the JSON with the ciphertext + // has been downloaded + + Alert.showRemaining('FOR YOUR EYES ONLY. Don\'t close this window, this message can\'t be displayed again.'); + $remainingTime.addClass('foryoureyesonly'); + } else if (paste.getTimeToLive() > 0) { + // display paste expiration + let expiration = Helper.secondsToHuman(paste.getTimeToLive()), + expirationLabel = [ + 'This document will expire in %d ' + expiration[1] + '.', + 'This document will expire in %d ' + expiration[1] + 's.' + ]; + + Alert.showRemaining([expirationLabel, expiration[0]]); + $remainingTime.removeClass('foryoureyesonly'); + } else { + // never expires + return; + } + + // in the end, display notification + $remainingTime.removeClass('hidden'); + }; + + /** + * hides the remaining time and successful upload notification + * + * @name PasteStatus.hideMessages + * @function + */ + me.hideMessages = function() + { + $remainingTime.addClass('hidden'); + $pasteSuccess.addClass('hidden'); + }; + + /** + * init status manager + * + * preloads jQuery elements + * + * @name PasteStatus.init + * @function + */ + me.init = function() + { + $pasteSuccess = $('#pastesuccess'); + // $pasteUrl is saved in me.createPasteNotification() after creation + $remainingTime = $('#remainingtime'); + $shortenButton = $('#shortenbutton'); + + // bind elements + $shortenButton.click(sendToShortener); + }; + + return me; + })(); + + /** + * password prompt + * + * @name Prompt + * @class + */ + const Prompt = (function () { + const me = {}; + + let $passwordDecrypt, + $passwordForm, + $passwordModal, + password = ''; + + /** + * submit a password in the modal dialog + * + * @name Prompt.submitPasswordModal + * @private + * @function + * @param {Event} event + */ + function submitPasswordModal(event) + { + event.preventDefault(); + + // get input + password = $passwordDecrypt.val(); + + // hide modal + $passwordModal.modal('hide'); + + PasteDecrypter.run(); + } + + /** + * ask the user for the password and set it + * + * @name Prompt.requestPassword + * @function + */ + me.requestPassword = function() + { + // show new bootstrap method (if available) + if ($passwordModal.length !== 0) { + $passwordModal.modal({ + backdrop: 'static', + keyboard: false + }); + return; + } + + // fallback to old method for page template + password = prompt(I18n._('Please enter the password for this paste:'), ''); + if (password === null) { + throw 'password prompt canceled'; + } + if (password.length === 0) { + // recurse… + return me.requestPassword(); + } + PasteDecrypter.run(); + }; + + /** + * get the cached password + * + * If you do not get a password with this function + * (returns an empty string), use requestPassword. + * + * @name Prompt.getPassword + * @function + * @return {string} + */ + me.getPassword = function() + { + return password; + }; + + /** + * resets the password to an empty string + * + * @name Prompt.reset + * @function + */ + me.reset = function() + { + // reset internal + password = ''; + + // and also reset UI + $passwordDecrypt.val(''); + } + + /** + * init status manager + * + * preloads jQuery elements + * + * @name Prompt.init + * @function + */ + me.init = function() + { + $passwordDecrypt = $('#passworddecrypt'); + $passwordForm = $('#passwordform'); + $passwordModal = $('#passwordmodal'); + + // bind events + + // focus password input when it is shown + $passwordModal.on('shown.bs.Model', function () { + $passwordDecrypt.focus(); + }); + // handle Model password submission + $passwordForm.submit(submitPasswordModal); + }; + + return me; + })(); + + /** + * Manage paste/message input, and preview tab + * + * Note that the actual preview is handled by PasteViewer. + * + * @name Editor + * @class + */ + const Editor = (function () { + const me = {}; + + let $editorTabs, + $messageEdit, + $messagePreview, + $message, + isPreview = false; + + /** + * support input of tab character + * + * @name Editor.supportTabs + * @function + * @param {Event} event + * @this $message (but not used, so it is jQuery-free, possibly faster) + */ + function supportTabs(event) + { + const keyCode = event.keyCode || event.which; + // tab was pressed + if (keyCode === 9) { + // get caret position & selection + const val = this.value, + start = this.selectionStart, + end = this.selectionEnd; + // set textarea value to: text before caret + tab + text after caret + this.value = val.substring(0, start) + '\t' + val.substring(end); + // put caret at right position again + this.selectionStart = this.selectionEnd = start + 1; + // prevent the textarea to lose focus + event.preventDefault(); + } + } + + /** + * view the Editor tab + * + * @name Editor.viewEditor + * @function + * @param {Event} event - optional + */ + function viewEditor(event) + { + // toggle buttons + $messageEdit.addClass('active'); + $messagePreview.removeClass('active'); + + PasteViewer.hide(); + + // reshow input + $message.removeClass('hidden'); + + me.focusInput(); + + // finish + isPreview = false; + + // prevent jumping of page to top + if (typeof event !== 'undefined') { + event.preventDefault(); + } + } + + /** + * view the preview tab + * + * @name Editor.viewPreview + * @function + * @param {Event} event + */ + function viewPreview(event) + { + // toggle buttons + $messageEdit.removeClass('active'); + $messagePreview.addClass('active'); + + // hide input as now preview is shown + $message.addClass('hidden'); + + // show preview + PasteViewer.setText($message.val()); + if (AttachmentViewer.hasAttachmentData()) { + const attachment = AttachmentViewer.getAttachment(); + AttachmentViewer.handleBlobAttachmentPreview( + AttachmentViewer.getAttachmentPreview(), + attachment[0], attachment[1] + ); + } + PasteViewer.run(); + + // finish + isPreview = true; + + // prevent jumping of page to top + if (typeof event !== 'undefined') { + event.preventDefault(); + } + } + + /** + * get the state of the preview + * + * @name Editor.isPreview + * @function + */ + me.isPreview = function() + { + return isPreview; + }; + + /** + * reset the Editor view + * + * @name Editor.resetInput + * @function + */ + me.resetInput = function() + { + // go back to input + if (isPreview) { + viewEditor(); + } + + // clear content + $message.val(''); + }; + + /** + * shows the Editor + * + * @name Editor.show + * @function + */ + me.show = function() + { + $message.removeClass('hidden'); + $editorTabs.removeClass('hidden'); + }; + + /** + * hides the Editor + * + * @name Editor.reset + * @function + */ + me.hide = function() + { + $message.addClass('hidden'); + $editorTabs.addClass('hidden'); + }; + + /** + * focuses the message input + * + * @name Editor.focusInput + * @function + */ + me.focusInput = function() + { + $message.focus(); + }; + + /** + * sets a new text + * + * @name Editor.setText + * @function + * @param {string} newText + */ + me.setText = function(newText) + { + $message.val(newText); + }; + + /** + * returns the current text + * + * @name Editor.getText + * @function + * @return {string} + */ + me.getText = function() + { + return $message.val(); + }; + + /** + * init status manager + * + * preloads jQuery elements + * + * @name Editor.init + * @function + */ + me.init = function() + { + $editorTabs = $('#editorTabs'); + $message = $('#message'); + + // bind events + $message.keydown(supportTabs); + + // bind click events to tab switchers (a), but save parent of them + // (li) + $messageEdit = $('#messageedit').click(viewEditor).parent(); + $messagePreview = $('#messagepreview').click(viewPreview).parent(); + }; + + return me; + })(); + + /** + * (view) Parse and show paste. + * + * @name PasteViewer + * @class + */ + const PasteViewer = (function () { + const me = {}; + + let $placeholder, + $prettyMessage, + $prettyPrint, + $plainText, + text, + format = 'plaintext', + isDisplayed = false, + isChanged = true; // by default true as nothing was parsed yet + + /** + * apply the set format on paste and displays it + * + * @name PasteViewer.parsePaste + * @private + * @function + */ + function parsePaste() + { + // skip parsing if no text is given + if (text === '') { + return; + } + + // escape HTML entities, link URLs, sanitize + const escapedLinkedText = Helper.urls2links( + Helper.htmlEntities(text) + ), + sanitizedLinkedText = DOMPurify.sanitize(escapedLinkedText); + $plainText.html(sanitizedLinkedText); + $prettyPrint.html(sanitizedLinkedText); + + switch (format) { + case 'markdown': + const converter = new showdown.Converter({ + strikethrough: true, + tables: true, + tablesHeaderId: true, + simplifiedAutoLink: true, + excludeTrailingPunctuationFromURLs: true + }); + // let showdown convert the HTML and sanitize HTML *afterwards*! + $plainText.html( + DOMPurify.sanitize( + converter.makeHtml(text) + ) + ); + // add table classes from bootstrap css + $plainText.find('table').addClass('table-condensed table-bordered'); + break; + case 'syntaxhighlighting': + // yes, this is really needed to initialize the environment + if (typeof prettyPrint === 'function') + { + prettyPrint(); + } + + $prettyPrint.html( + DOMPurify.sanitize( + prettyPrintOne(escapedLinkedText, null, true) + ) + ); + // fall through, as the rest is the same + default: // = 'plaintext' + $prettyPrint.css('white-space', 'pre-wrap'); + $prettyPrint.css('word-break', 'normal'); + $prettyPrint.removeClass('prettyprint'); + } + } + + /** + * displays the paste + * + * @name PasteViewer.showPaste + * @private + * @function + */ + function showPaste() + { + // instead of "nothing" better display a placeholder + if (text === '') { + $placeholder.removeClass('hidden'); + return; + } + // otherwise hide the placeholder + $placeholder.addClass('hidden'); + + switch (format) { + case 'markdown': + $plainText.removeClass('hidden'); + $prettyMessage.addClass('hidden'); + break; + default: + $plainText.addClass('hidden'); + $prettyMessage.removeClass('hidden'); + break; + } + } + + /** + * sets the format in which the text is shown + * + * @name PasteViewer.setFormat + * @function + * @param {string} newFormat the new format + */ + me.setFormat = function(newFormat) + { + // skip if there is no update + if (format === newFormat) { + return; + } + + // needs to update display too, if we switch from or to Markdown + if (format === 'markdown' || newFormat === 'markdown') { + isDisplayed = false; + } + + format = newFormat; + isChanged = true; + }; + + /** + * returns the current format + * + * @name PasteViewer.getFormat + * @function + * @return {string} + */ + me.getFormat = function() + { + return format; + }; + + /** + * returns whether the current view is pretty printed + * + * @name PasteViewer.isPrettyPrinted + * @function + * @return {bool} + */ + me.isPrettyPrinted = function() + { + return $prettyPrint.hasClass('prettyprinted'); + }; + + /** + * sets the text to show + * + * @name PasteViewer.setText + * @function + * @param {string} newText the text to show + */ + me.setText = function(newText) + { + if (text !== newText) { + text = newText; + isChanged = true; + } + }; + + /** + * gets the current cached text + * + * @name PasteViewer.getText + * @function + * @return {string} + */ + me.getText = function() + { + return text; + }; + + /** + * show/update the parsed text (preview) + * + * @name PasteViewer.run + * @function + */ + me.run = function() + { + if (isChanged) { + parsePaste(); + isChanged = false; + } + + if (!isDisplayed) { + showPaste(); + isDisplayed = true; + } + }; + + /** + * hide parsed text (preview) + * + * @name PasteViewer.hide + * @function + */ + me.hide = function() + { + if (!isDisplayed) { + return; + } + + $plainText.addClass('hidden'); + $prettyMessage.addClass('hidden'); + $placeholder.addClass('hidden'); + AttachmentViewer.hideAttachmentPreview(); + + isDisplayed = false; + }; + + /** + * init status manager + * + * preloads jQuery elements + * + * @name PasteViewer.init + * @function + */ + me.init = function() + { + $placeholder = $('#placeholder'); + $plainText = $('#plaintext'); + $prettyMessage = $('#prettymessage'); + $prettyPrint = $('#prettyprint'); + + // get default option from template/HTML or fall back to set value + format = Model.getFormatDefault() || format; + text = ''; + isDisplayed = false; + isChanged = true; + }; + + return me; + })(); + + /** + * (view) Show attachment and preview if possible + * + * @name AttachmentViewer + * @class + */ + const AttachmentViewer = (function () { + const me = {}; + + let $attachmentLink, + $attachmentPreview, + $attachment, + attachmentData, + file, + $fileInput, + $dragAndDropFileName, + attachmentHasPreview = false, + $dropzone; + + /** + * sets the attachment but does not yet show it + * + * @name AttachmentViewer.setAttachment + * @function + * @param {string} attachmentData - base64-encoded data of file + * @param {string} fileName - optional, file name + */ + me.setAttachment = function(attachmentData, fileName) + { + // data URI format: data:[][;base64], + + // position in data URI string of where data begins + const base64Start = attachmentData.indexOf(',') + 1; + // position in data URI string of where mediaType ends + const mediaTypeEnd = attachmentData.indexOf(';'); + + // extract mediaType + const mediaType = attachmentData.substring(5, mediaTypeEnd); + // extract data and convert to binary + const decodedData = atob(attachmentData.substring(base64Start)); + + // Transform into a Blob + const buf = new Uint8Array(decodedData.length); + for (let i = 0; i < decodedData.length; ++i) { + buf[i] = decodedData.charCodeAt(i); + } + const blob = new window.Blob([ buf ], { type: mediaType }); + + // Get Blob URL + const blobUrl = window.URL.createObjectURL(blob); + + // IE does not support setting a data URI on an a element + // Using msSaveBlob to download + if (window.Blob && navigator.msSaveBlob) { + $attachmentLink.off('click').on('click', function () { + navigator.msSaveBlob(blob, fileName); + }); + } else { + $attachmentLink.attr('href', blobUrl); + } + + if (typeof fileName !== 'undefined') { + $attachmentLink.attr('download', fileName); + } + + me.handleBlobAttachmentPreview($attachmentPreview, blobUrl, mediaType); + }; + + /** + * displays the attachment + * + * @name AttachmentViewer.showAttachment + * @function + */ + me.showAttachment = function() + { + $attachment.removeClass('hidden'); + + if (attachmentHasPreview) { + $attachmentPreview.removeClass('hidden'); + } + }; + + /** + * removes the attachment + * + * This automatically hides the attachment containers too, to + * prevent an inconsistent display. + * + * @name AttachmentViewer.removeAttachment + * @function + */ + me.removeAttachment = function() + { + if (!$attachment.length) { + return; + } + me.hideAttachment(); + me.hideAttachmentPreview(); + $attachmentLink.removeAttr('href'); + $attachmentLink.removeAttr('download'); + $attachmentLink.off('click'); + $attachmentPreview.html(''); + $dragAndDropFileName.text(''); + + AttachmentViewer.removeAttachmentData(); + }; + + /** + * removes the attachment data + * + * This removes the data, which would be uploaded otherwise. + * + * @name AttachmentViewer.removeAttachmentData + * @function + */ + me.removeAttachmentData = function() + { + file = undefined; + attachmentData = undefined; + }; + + /** + * Cleares the drag & drop data. + * + * @name AttachmentViewer.clearDragAndDrop + * @function + */ + me.clearDragAndDrop = function() + { + $dragAndDropFileName.text(''); + }; + + /** + * hides the attachment + * + * This will not hide the preview (see AttachmentViewer.hideAttachmentPreview + * for that) nor will it hide the attachment link if it was moved somewhere + * else (see AttachmentViewer.moveAttachmentTo). + * + * @name AttachmentViewer.hideAttachment + * @function + */ + me.hideAttachment = function() + { + $attachment.addClass('hidden'); + }; + + /** + * hides the attachment preview + * + * @name AttachmentViewer.hideAttachmentPreview + * @function + */ + me.hideAttachmentPreview = function() + { + if ($attachmentPreview) { + $attachmentPreview.addClass('hidden'); + } + }; + + /** + * checks if there is an attachment displayed + * + * @name AttachmentViewer.hasAttachment + * @function + */ + me.hasAttachment = function() + { + if (!$attachment.length) { + return false; + } + const link = $attachmentLink.prop('href'); + return (typeof link !== 'undefined' && link !== ''); + }; + + /** + * checks if there is attachment data (for preview!) available + * + * It returns true, when there is data that needs to be encrypted. + * + * @name AttachmentViewer.hasAttachmentData + * @function + */ + me.hasAttachmentData = function() + { + if ($attachment.length) { + return true; + } + return false; + }; + + /** + * return the attachment + * + * @name AttachmentViewer.getAttachment + * @function + * @returns {array} + */ + me.getAttachment = function() + { + return [ + $attachmentLink.prop('href'), + $attachmentLink.prop('download') + ]; + }; + + /** + * moves the attachment link to another element + * + * It is advisable to hide the attachment afterwards (AttachmentViewer.hideAttachment) + * + * @name AttachmentViewer.moveAttachmentTo + * @function + * @param {jQuery} $element - the wrapper/container element where this should be moved to + * @param {string} label - the text to show (%s will be replaced with the file name), will automatically be translated + */ + me.moveAttachmentTo = function($element, label) + { + // move elemement to new place + $attachmentLink.appendTo($element); + + // update text - ensuring no HTML is inserted into the text node + I18n._($attachmentLink, label, $attachmentLink.attr('download')); + }; + + /** + * read file data as data URL using the FileReader API + * + * @name AttachmentViewer.readFileData + * @private + * @function + * @param {object} loadedFile (optional) loaded file object + * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/FileReader#readAsDataURL()} + */ + function readFileData(loadedFile) { + if (typeof FileReader === 'undefined') { + // revert loading status… + me.hideAttachment(); + me.hideAttachmentPreview(); + Alert.showWarning('Your browser does not support uploading encrypted files. Please use a newer browser.'); + return; + } + + const fileReader = new FileReader(); + if (loadedFile === undefined) { + loadedFile = $fileInput[0].files[0]; + $dragAndDropFileName.text(''); + } else { + $dragAndDropFileName.text(loadedFile.name); + } + + if (typeof loadedFile !== 'undefined') { + file = loadedFile; + fileReader.onload = function (event) { + const dataURL = event.target.result; + attachmentData = dataURL; + + if (Editor.isPreview()) { + me.handleAttachmentPreview($attachmentPreview, dataURL); + $attachmentPreview.removeClass('hidden'); + } + + TopNav.highlightFileupload(); + }; + fileReader.readAsDataURL(loadedFile); + } else { + me.removeAttachmentData(); + } + } + + /** + * handle the preview of files decoded to blob that can either be an image, video, audio or pdf element + * + * @name AttachmentViewer.handleBlobAttachmentPreview + * @function + * @argument {jQuery} $targetElement element where the preview should be appended + * @argument {string} file as a blob URL + * @argument {string} mime type + */ + me.handleBlobAttachmentPreview = function ($targetElement, blobUrl, mimeType) { + if (blobUrl) { + attachmentHasPreview = true; + if (mimeType.match(/image\//i)) { + $targetElement.html( + $(document.createElement('img')) + .attr('src', blobUrl) + .attr('class', 'img-thumbnail') + ); + } else if (mimeType.match(/video\//i)) { + $targetElement.html( + $(document.createElement('video')) + .attr('controls', 'true') + .attr('autoplay', 'true') + .attr('class', 'img-thumbnail') + + .append($(document.createElement('source')) + .attr('type', mimeType) + .attr('src', blobUrl)) + ); + } else if (mimeType.match(/audio\//i)) { + $targetElement.html( + $(document.createElement('audio')) + .attr('controls', 'true') + .attr('autoplay', 'true') + + .append($(document.createElement('source')) + .attr('type', mimeType) + .attr('src', blobUrl)) + ); + } else if (mimeType.match(/\/pdf/i)) { + // Fallback for browsers, that don't support the vh unit + const clientHeight = $(window).height(); + + $targetElement.html( + $(document.createElement('embed')) + .attr('src', blobUrl) + .attr('type', 'application/pdf') + .attr('class', 'pdfPreview') + .css('height', clientHeight) + ); + } else { + attachmentHasPreview = false; + } + } + }; + + /** + * attaches the file attachment drag & drop handler to the page + * + * @name AttachmentViewer.addDragDropHandler + * @private + * @function + */ + function addDragDropHandler() { + if (typeof $fileInput === 'undefined' || $fileInput.length === 0) { + return; + } + + const handleDragEnterOrOver = function(event) { + event.stopPropagation(); + event.preventDefault(); + return false; + }; + + const handleDrop = function(event) { + const evt = event.originalEvent; + evt.stopPropagation(); + evt.preventDefault(); + + if (TopNav.isAttachmentReadonly()) { + return false; + } + + if ($fileInput) { + const file = evt.dataTransfer.files[0]; + //Clear the file input: + $fileInput.wrap('
').closest('form').get(0).reset(); + $fileInput.unwrap(); + //Only works in Chrome: + //fileInput[0].files = e.dataTransfer.files; + + readFileData(file); + } + }; + + $(document).draghover().on({ + 'draghoverstart': function(e) { + if (TopNav.isAttachmentReadonly()) { + e.stopPropagation(); + e.preventDefault(); + return false; + } + // show dropzone to indicate drop support + $dropzone.removeClass('hidden'); + }, + 'draghoverend': function() { + $dropzone.addClass('hidden'); + } + }); + + $(document).on('drop', handleDrop); + $(document).on('dragenter dragover', handleDragEnterOrOver); + + $fileInput.on('change', function () { + readFileData(); + }); + } + + /** + * attaches the clipboard attachment handler to the page + * + * @name AttachmentViewer.addClipboardEventHandler + * @private + * @function + */ + function addClipboardEventHandler() { + $(document).on('paste', function (event) { + if (TopNav.isAttachmentReadonly()) { + event.stopPropagation(); + event.preventDefault(); + return false; + } + const items = (event.clipboardData || event.originalEvent.clipboardData).items; + for (let i = 0; i < items.length; ++i) { + if (items[i].kind === 'file') { + //Clear the file input: + $fileInput.wrap('').closest('form').get(0).reset(); + $fileInput.unwrap(); + + readFileData(items[i].getAsFile()); + } + } + }); + } + + + /** + * getter for attachment data + * + * @name AttachmentViewer.getAttachmentData + * @function + * @return {jQuery} + */ + me.getAttachmentData = function () { + return attachmentData; + }; + + /** + * getter for attachment link + * + * @name AttachmentViewer.getAttachmentLink + * @function + * @return {jQuery} + */ + me.getAttachmentLink = function () { + return $attachmentLink; + }; + + /** + * getter for attachment preview + * + * @name AttachmentViewer.getAttachmentPreview + * @function + * @return {jQuery} + */ + me.getAttachmentPreview = function () { + return $attachmentPreview; + }; + + /** + * getter for file data, returns the file contents + * + * @name AttachmentViewer.getFile + * @function + * @return {string} + */ + me.getFile = function () { + return file; + }; + + /** + * initiate + * + * preloads jQuery elements + * + * @name AttachmentViewer.init + * @function + */ + me.init = function() + { + $attachment = $('#attachment'); + $dragAndDropFileName = $('#dragAndDropFileName'); + $dropzone = $('#dropzone'); + $attachmentLink = $('#attachment a') || $(''); + if($attachment.length) { + $attachmentPreview = $('#attachmentPreview'); + + $fileInput = $('#file'); + addDragDropHandler(); + addClipboardEventHandler(); + } + } + + return me; + })(); + + /** + * (view) Shows discussion thread and handles replies + * + * @name DiscussionViewer + * @class + */ + const DiscussionViewer = (function () { + const me = {}; + + let $commentTail, + $discussion, + $reply, + $replyMessage, + $replyNickname, + $replyStatus, + $commentContainer, + replyCommentId; + + /** + * initializes the templates + * + * @name DiscussionViewer.initTemplates + * @private + * @function + */ + function initTemplates() + { + $reply = Model.getTemplate('reply'); + $replyMessage = $reply.find('#replymessage'); + $replyNickname = $reply.find('#nickname'); + $replyStatus = $reply.find('#replystatus'); + + // cache jQuery elements + $commentTail = Model.getTemplate('commenttail'); + } + + /** + * open the comment entry when clicking the "Reply" button of a comment + * + * @name DiscussionViewer.openReply + * @private + * @function + * @param {Event} event + */ + function openReply(event) + { + const $source = $(event.target); + + // clear input + $replyMessage.val(''); + $replyNickname.val(''); + + // get comment id from source element + replyCommentId = $source.parent().prop('id').split('_')[1]; + + // move to correct position + $source.after($reply); + + // show + $reply.removeClass('hidden'); + $replyMessage.focus(); + + event.preventDefault(); + } + + /** + * custom handler for displaying notifications in own status message area + * + * @name DiscussionViewer.handleNotification + * @function + * @param {string} alertType + * @return {bool|jQuery} + */ + me.handleNotification = function(alertType) + { + // ignore loading messages + if (alertType === 'loading') { + return false; + } + + if (alertType === 'danger') { + $replyStatus.removeClass('alert-info'); + $replyStatus.addClass('alert-danger'); + $replyStatus.find(':first').removeClass('glyphicon-alert'); + $replyStatus.find(':first').addClass('glyphicon-info-sign'); + } else { + $replyStatus.removeClass('alert-danger'); + $replyStatus.addClass('alert-info'); + $replyStatus.find(':first').removeClass('glyphicon-info-sign'); + $replyStatus.find(':first').addClass('glyphicon-alert'); + } + + return $replyStatus; + }; + + /** + * adds another comment + * + * @name DiscussionViewer.addComment + * @function + * @param {Comment} comment + * @param {string} commentText + * @param {string} nickname + */ + me.addComment = function(comment, commentText, nickname) + { + if (commentText === '') { + commentText = 'comment decryption failed'; + } + + // create new comment based on template + const $commentEntry = Model.getTemplate('comment'); + $commentEntry.prop('id', 'comment_' + comment.id); + const $commentEntryData = $commentEntry.find('div.commentdata'); + + // set & parse text + $commentEntryData.html( + DOMPurify.sanitize( + Helper.urls2links(commentText) + ) + ); + + // set nickname + if (nickname.length > 0) { + $commentEntry.find('span.nickname').text(nickname); + } else { + $commentEntry.find('span.nickname').html(''); + I18n._($commentEntry.find('span.nickname i'), 'Anonymous'); + } + + // set date + $commentEntry.find('span.commentdate') + .text(' (' + (new Date(comment.getCreated() * 1000).toLocaleString()) + ')') + .attr('title', 'CommentID: ' + comment.id); + + // if an avatar is available, display it + const icon = comment.getIcon(); + if (icon) { + $commentEntry.find('span.nickname') + .before( + ' ' + ); + $(document).on('languageLoaded', function () { + $commentEntry.find('img.vizhash') + .prop('title', I18n._('Avatar generated from IP address')); + }); + } + + // starting point (default value/fallback) + let $place = $commentContainer; + + // if parent comment exists + const $parentComment = $('#comment_' + comment.parentid); + if ($parentComment.length) { + // use parent as position for new comment, so it is shifted + // to the right + $place = $parentComment; + } + + // finally append comment + $place.append($commentEntry); + }; + + /** + * finishes the discussion area after last comment + * + * @name DiscussionViewer.finishDiscussion + * @function + */ + me.finishDiscussion = function() + { + // add 'add new comment' area + $commentContainer.append($commentTail); + + // show discussions + $discussion.removeClass('hidden'); + }; + + /** + * removes the old discussion and prepares everything for creating a new + * one. + * + * @name DiscussionViewer.prepareNewDiscussion + * @function + */ + me.prepareNewDiscussion = function() + { + $commentContainer.html(''); + $discussion.addClass('hidden'); + + // (re-)init templates + initTemplates(); + }; + + /** + * returns the users message from the reply form + * + * @name DiscussionViewer.getReplyMessage + * @function + * @return {String} + */ + me.getReplyMessage = function() + { + return $replyMessage.val(); + }; + + /** + * returns the users nickname (if any) from the reply form + * + * @name DiscussionViewer.getReplyNickname + * @function + * @return {String} + */ + me.getReplyNickname = function() + { + return $replyNickname.val(); + }; + + /** + * returns the id of the parent comment the user is replying to + * + * @name DiscussionViewer.getReplyCommentId + * @function + * @return {int|undefined} + */ + me.getReplyCommentId = function() + { + return replyCommentId; + }; + + /** + * highlights a specific comment and scrolls to it if necessary + * + * @name DiscussionViewer.highlightComment + * @function + * @param {string} commentId + * @param {bool} fadeOut - whether to fade out the comment + */ + me.highlightComment = function(commentId, fadeOut) + { + const $comment = $('#comment_' + commentId); + // in case comment does not exist, cancel + if ($comment.length === 0) { + return; + } + + $comment.addClass('highlight'); + const highlightComment = function () { + if (fadeOut === true) { + setTimeout(function () { + $comment.removeClass('highlight'); + }, 300); + } + }; + + if (UiHelper.isVisible($comment)) { + return highlightComment(); + } + + UiHelper.scrollTo($comment, 100, 'swing', highlightComment); + }; + + /** + * initiate + * + * preloads jQuery elements + * + * @name DiscussionViewer.init + * @function + */ + me.init = function() + { + // bind events to templates (so they are later cloned) + $('#commenttailtemplate, #commenttemplate').find('button').on('click', openReply); + $('#replytemplate').find('button').on('click', PasteEncrypter.sendComment); + + $commentContainer = $('#commentcontainer'); + $discussion = $('#discussion'); + }; + + return me; + })(); + + /** + * Manage top (navigation) bar + * + * @name TopNav + * @param {object} window + * @param {object} document + * @class + */ + const TopNav = (function (window, document) { + const me = {}; + + let createButtonsDisplayed = false, + viewButtonsDisplayed = false, + $attach, + $burnAfterReading, + $burnAfterReadingOption, + $cloneButton, + $customAttachment, + $expiration, + $fileRemoveButton, + $fileWrap, + $formatter, + $newButton, + $openDiscussion, + $openDiscussionOption, + $password, + $passwordInput, + $rawTextButton, + $qrCodeLink, + $emailLink, + $sendButton, + $retryButton, + pasteExpiration = null, + retryButtonCallback; + + /** + * set the expiration on bootstrap templates in dropdown + * + * @name TopNav.updateExpiration + * @private + * @function + * @param {Event} event + */ + function updateExpiration(event) + { + // get selected option + const target = $(event.target); + + // update dropdown display and save new expiration time + $('#pasteExpirationDisplay').text(target.text()); + pasteExpiration = target.data('expiration'); + + event.preventDefault(); + } + + /** + * set the format on bootstrap templates in dropdown from user interaction + * + * @name TopNav.updateFormat + * @private + * @function + * @param {Event} event + */ + function updateFormat(event) + { + // get selected option + const $target = $(event.target); + + // update dropdown display and save new format + const newFormat = $target.data('format'); + $('#pasteFormatterDisplay').text($target.text()); + PasteViewer.setFormat(newFormat); + + // update preview + if (Editor.isPreview()) { + PasteViewer.run(); + } + + event.preventDefault(); + } + + /** + * when "burn after reading" is checked, disable discussion + * + * @name TopNav.changeBurnAfterReading + * @private + * @function + */ + function changeBurnAfterReading() + { + if ($burnAfterReading.is(':checked')) { + $openDiscussionOption.addClass('buttondisabled'); + $openDiscussion.prop('checked', false); + + // if button is actually disabled, force-enable it and uncheck other button + $burnAfterReadingOption.removeClass('buttondisabled'); + } else { + $openDiscussionOption.removeClass('buttondisabled'); + } + } + + /** + * when discussion is checked, disable "burn after reading" + * + * @name TopNav.changeOpenDiscussion + * @private + * @function + */ + function changeOpenDiscussion() + { + if ($openDiscussion.is(':checked')) { + $burnAfterReadingOption.addClass('buttondisabled'); + $burnAfterReading.prop('checked', false); + + // if button is actually disabled, force-enable it and uncheck other button + $openDiscussionOption.removeClass('buttondisabled'); + } else { + $burnAfterReadingOption.removeClass('buttondisabled'); + } + } + + /** + * return raw text + * + * @name TopNav.rawText + * @private + * @function + */ + function rawText() + { + TopNav.hideAllButtons(); + Alert.showLoading('Showing raw text…', 'time'); + let paste = PasteViewer.getText(); + + // push a new state to allow back navigation with browser back button + history.pushState( + {type: 'raw'}, + document.title, + // recreate paste URL + Helper.baseUri() + '?' + Model.getPasteId() + '#' + + CryptTool.base58encode(Model.getPasteKey()) + ); + + // we use text/html instead of text/plain to avoid a bug when + // reloading the raw text view (it reverts to type text/html) + const $head = $('head').children().not('noscript, script, link[type="text/css"]'), + newDoc = document.open('text/html', 'replace'); + newDoc.write(''); + for (let i = 0; i < $head.length; ++i) { + newDoc.write($head[i].outerHTML); + } + newDoc.write('
' + DOMPurify.sanitize(Helper.htmlEntities(paste)) + '
'); + newDoc.close(); + } + + /** + * saves the language in a cookie and reloads the page + * + * @name TopNav.setLanguage + * @private + * @function + * @param {Event} event + */ + function setLanguage(event) + { + document.cookie = 'lang=' + $(event.target).data('lang'); + UiHelper.reloadHome(); + } + + /** + * hides all messages and creates a new paste + * + * @name TopNav.clickNewPaste + * @private + * @function + */ + function clickNewPaste() + { + Controller.hideStatusMessages(); + Controller.newPaste(); + } + + /** + * retrys some callback registered before + * + * @name TopNav.clickRetryButton + * @private + * @function + * @param {Event} event + */ + function clickRetryButton(event) + { + retryButtonCallback(event); + } + + /** + * removes the existing attachment + * + * @name TopNav.removeAttachment + * @private + * @function + * @param {Event} event + */ + function removeAttachment(event) + { + // if custom attachment is used, remove it first + if (!$customAttachment.hasClass('hidden')) { + AttachmentViewer.removeAttachment(); + $customAttachment.addClass('hidden'); + $fileWrap.removeClass('hidden'); + } + + // in any case, remove saved attachment data + AttachmentViewer.removeAttachmentData(); + + // hide UI for selected files + // our up-to-date jQuery can handle it :) + $fileWrap.find('input').val(''); + AttachmentViewer.clearDragAndDrop(); + + // pevent '#' from appearing in the URL + event.preventDefault(); + } + + /** + * Shows the QR code of the current paste (URL). + * + * @name TopNav.displayQrCode + * @private + * @function + */ + function displayQrCode() + { + const qrCanvas = kjua({ + render: 'canvas', + text: window.location.href + }); + $('#qrcode-display').html(qrCanvas); + } + + /** + * Template Email body. + * + * @name TopNav.templateEmailBody + * @private + * @param {string} expirationDateString + * @param {bool} isBurnafterreading + */ + function templateEmailBody(expirationDateString, isBurnafterreading) + { + const EOL = '\n'; + const BULLET = ' - '; + let emailBody = ''; + if (expirationDateString !== null || isBurnafterreading) { + emailBody += I18n._('Notice:'); + emailBody += EOL; + + if (expirationDateString !== null) { + emailBody += EOL; + emailBody += BULLET; + emailBody += I18n._( + 'This link will expire after %s.', + expirationDateString + ); + } + if (isBurnafterreading) { + emailBody += EOL; + emailBody += BULLET; + emailBody += I18n._( + 'This link can only be accessed once, do not use back or refresh button in your browser.' + ); + } + + emailBody += EOL; + emailBody += EOL; + } + emailBody += I18n._('Link:'); + emailBody += EOL; + emailBody += `${window.location.href}`; + return emailBody; + } + + /** + * Trigger Email send. + * + * @name TopNav.triggerEmailSend + * @private + * @param {string} emailBody + */ + function triggerEmailSend(emailBody) + { + window.open( + `mailto:?body=${encodeURIComponent(emailBody)}`, + '_self', + 'noopener, noreferrer' + ); + } + + /** + * Send Email with current paste (URL). + * + * @name TopNav.sendEmail + * @private + * @function + * @param {Date|null} expirationDate date of expiration + * @param {bool} isBurnafterreading whether it is burn after reading + */ + function sendEmail(expirationDate, isBurnafterreading) + { + const expirationDateRoundedToSecond = new Date(expirationDate); + + // round down at least 30 seconds to make up for the delay of request + expirationDateRoundedToSecond.setUTCSeconds( + expirationDateRoundedToSecond.getUTCSeconds() - 30 + ); + expirationDateRoundedToSecond.setUTCSeconds(0); + + const $emailconfirmmodal = $('#emailconfirmmodal'); + if ($emailconfirmmodal.length > 0) { + if (expirationDate !== null) { + $emailconfirmmodal.find('#emailconfirm-display').text( + I18n._('Recipient may become aware of your timezone, convert time to UTC?') + ); + const $emailconfirmTimezoneCurrent = $emailconfirmmodal.find('#emailconfirm-timezone-current'); + const $emailconfirmTimezoneUtc = $emailconfirmmodal.find('#emailconfirm-timezone-utc'); + $emailconfirmTimezoneCurrent.off('click.sendEmailCurrentTimezone'); + $emailconfirmTimezoneCurrent.on('click.sendEmailCurrentTimezone', () => { + const emailBody = templateEmailBody(expirationDateRoundedToSecond.toLocaleString(), isBurnafterreading); + $emailconfirmmodal.modal('hide'); + triggerEmailSend(emailBody); + }); + $emailconfirmTimezoneUtc.off('click.sendEmailUtcTimezone'); + $emailconfirmTimezoneUtc.on('click.sendEmailUtcTimezone', () => { + const emailBody = templateEmailBody(expirationDateRoundedToSecond.toLocaleString( + undefined, + // we don't use Date.prototype.toUTCString() because we would like to avoid GMT + { timeZone: 'UTC', dateStyle: 'long', timeStyle: 'long' } + ), isBurnafterreading); + $emailconfirmmodal.modal('hide'); + triggerEmailSend(emailBody); + }); + $emailconfirmmodal.modal('show'); + } else { + triggerEmailSend(templateEmailBody(null, isBurnafterreading)); + } + } else { + let emailBody = ''; + if (expirationDate !== null) { + const expirationDateString = window.confirm( + I18n._('Recipient may become aware of your timezone, convert time to UTC?') + ) ? expirationDateRoundedToSecond.toLocaleString( + undefined, + // we don't use Date.prototype.toUTCString() because we would like to avoid GMT + { timeZone: 'UTC', dateStyle: 'long', timeStyle: 'long' } + ) : expirationDateRoundedToSecond.toLocaleString(); + emailBody = templateEmailBody(expirationDateString, isBurnafterreading); + } else { + emailBody = templateEmailBody(null, isBurnafterreading); + } + triggerEmailSend(emailBody); + } + } + + /** + * Shows all navigation elements for viewing an existing paste + * + * @name TopNav.showViewButtons + * @function + */ + me.showViewButtons = function() + { + if (viewButtonsDisplayed) { + return; + } + + $newButton.removeClass('hidden'); + $cloneButton.removeClass('hidden'); + $rawTextButton.removeClass('hidden'); + $qrCodeLink.removeClass('hidden'); + + viewButtonsDisplayed = true; + }; + + /** + * Hides all navigation elements for viewing an existing paste + * + * @name TopNav.hideViewButtons + * @function + */ + me.hideViewButtons = function() + { + if (!viewButtonsDisplayed) { + return; + } + + $cloneButton.addClass('hidden'); + $newButton.addClass('hidden'); + $rawTextButton.addClass('hidden'); + $qrCodeLink.addClass('hidden'); + me.hideEmailButton(); + + viewButtonsDisplayed = false; + }; + + /** + * Hides all elements belonging to existing pastes + * + * @name TopNav.hideAllButtons + * @function + */ + me.hideAllButtons = function() + { + me.hideViewButtons(); + me.hideCreateButtons(); + }; + + /** + * shows all elements needed when creating a new paste + * + * @name TopNav.showCreateButtons + * @function + */ + me.showCreateButtons = function() + { + if (createButtonsDisplayed) { + return; + } + + $attach.removeClass('hidden'); + $burnAfterReadingOption.removeClass('hidden'); + $expiration.removeClass('hidden'); + $formatter.removeClass('hidden'); + $newButton.removeClass('hidden'); + $openDiscussionOption.removeClass('hidden'); + $password.removeClass('hidden'); + $sendButton.removeClass('hidden'); + + createButtonsDisplayed = true; + }; + + /** + * shows all elements needed when creating a new paste + * + * @name TopNav.hideCreateButtons + * @function + */ + me.hideCreateButtons = function() + { + if (!createButtonsDisplayed) { + return; + } + + $newButton.addClass('hidden'); + $sendButton.addClass('hidden'); + $expiration.addClass('hidden'); + $formatter.addClass('hidden'); + $burnAfterReadingOption.addClass('hidden'); + $openDiscussionOption.addClass('hidden'); + $password.addClass('hidden'); + $attach.addClass('hidden'); + + createButtonsDisplayed = false; + }; + + /** + * only shows the "new paste" button + * + * @name TopNav.showNewPasteButton + * @function + */ + me.showNewPasteButton = function() + { + $newButton.removeClass('hidden'); + }; + + /** + * only shows the "retry" button + * + * @name TopNav.showRetryButton + * @function + */ + me.showRetryButton = function() + { + $retryButton.removeClass('hidden'); + } + + /** + * hides the "retry" button + * + * @name TopNav.hideRetryButton + * @function + */ + me.hideRetryButton = function() + { + $retryButton.addClass('hidden'); + } + + /** + * show the "email" button + * + * @name TopNav.showEmailbutton + * @function + * @param {int|undefined} optionalRemainingTimeInSeconds + */ + me.showEmailButton = function(optionalRemainingTimeInSeconds) + { + try { + // we cache expiration date in closure to avoid inaccurate expiration datetime + const expirationDate = Helper.calculateExpirationDate( + new Date(), + typeof optionalRemainingTimeInSeconds === 'number' ? optionalRemainingTimeInSeconds : TopNav.getExpiration() + ); + const isBurnafterreading = TopNav.getBurnAfterReading(); + + $emailLink.removeClass('hidden'); + $emailLink.off('click.sendEmail'); + $emailLink.on('click.sendEmail', () => { + sendEmail(expirationDate, isBurnafterreading); + }); + } catch (error) { + console.error(error); + Alert.showError( + I18n._('Cannot calculate expiration date.') + ); + } + } + + /** + * hide the "email" button + * + * @name TopNav.hideEmailButton + * @function + */ + me.hideEmailButton = function() + { + $emailLink.addClass('hidden'); + $emailLink.off('click.sendEmail'); + } + + /** + * only hides the clone button + * + * @name TopNav.hideCloneButton + * @function + */ + me.hideCloneButton = function() + { + $cloneButton.addClass('hidden'); + }; + + /** + * only hides the raw text button + * + * @name TopNav.hideRawButton + * @function + */ + me.hideRawButton = function() + { + $rawTextButton.addClass('hidden'); + }; + + /** + * only hides the qr code button + * + * @name TopNav.hideQrCodeButton + * @function + */ + me.hideQrCodeButton = function() + { + $qrCodeLink.addClass('hidden'); + } + + /** + * hide all irrelevant buttons when viewing burn after reading paste + * + * @name TopNav.hideBurnAfterReadingButtons + * @function + */ + me.hideBurnAfterReadingButtons = function() + { + me.hideCloneButton(); + me.hideQrCodeButton(); + me.hideEmailButton(); + } + + /** + * hides the file selector in attachment + * + * @name TopNav.hideFileSelector + * @function + */ + me.hideFileSelector = function() + { + $fileWrap.addClass('hidden'); + }; + + + /** + * shows the custom attachment + * + * @name TopNav.showCustomAttachment + * @function + */ + me.showCustomAttachment = function() + { + $customAttachment.removeClass('hidden'); + }; + + /** + * hides the custom attachment + * + * @name TopNav.hideCustomAttachment + * @function + */ + me.hideCustomAttachment = function() + { + $customAttachment.addClass('hidden'); + $fileWrap.removeClass('hidden'); + }; + + /** + * collapses the navigation bar, only if expanded + * + * @name TopNav.collapseBar + * @function + */ + me.collapseBar = function() + { + if ($('#navbar').attr('aria-expanded') === 'true') { + $('.navbar-toggle').click(); + } + }; + + /** + * returns the currently set expiration time + * + * @name TopNav.getExpiration + * @function + * @return {int} + */ + me.getExpiration = function() + { + return pasteExpiration; + }; + + /** + * returns the currently selected file(s) + * + * @name TopNav.getFileList + * @function + * @return {FileList|null} + */ + me.getFileList = function() + { + const $file = $('#file'); + + // if no file given, return null + if (!$file.length || !$file[0].files.length) { + return null; + } + + // ensure the selected file is still accessible + if (!($file[0].files && $file[0].files[0])) { + return null; + } + + return $file[0].files; + }; + + /** + * returns the state of the burn after reading checkbox + * + * @name TopNav.getBurnAfterReading + * @function + * @return {bool} + */ + me.getBurnAfterReading = function() + { + return $burnAfterReading.is(':checked'); + }; + + /** + * returns the state of the discussion checkbox + * + * @name TopNav.getOpenDiscussion + * @function + * @return {bool} + */ + me.getOpenDiscussion = function() + { + return $openDiscussion.is(':checked'); + }; + + /** + * returns the entered password + * + * @name TopNav.getPassword + * @function + * @return {string} + */ + me.getPassword = function() + { + // when password is disabled $passwordInput.val() will return undefined + return $passwordInput.val() || ''; + }; + + /** + * returns the element where custom attachments can be placed + * + * Used by AttachmentViewer when an attachment is cloned here. + * + * @name TopNav.getCustomAttachment + * @function + * @return {jQuery} + */ + me.getCustomAttachment = function() + { + return $customAttachment; + }; + + /** + * Set a function to call when the retry button is clicked. + * + * @name TopNav.setRetryCallback + * @function + * @param {function} callback + */ + me.setRetryCallback = function(callback) + { + retryButtonCallback = callback; + } + + /** + * Highlight file upload + * + * @name TopNav.highlightFileupload + * @function + */ + me.highlightFileupload = function() + { + // visually indicate file uploaded + const $attachDropdownToggle = $attach.children('.dropdown-toggle'); + if ($attachDropdownToggle.attr('aria-expanded') === 'false') { + $attachDropdownToggle.click(); + } + $fileWrap.addClass('highlight'); + setTimeout(function () { + $fileWrap.removeClass('highlight'); + }, 300); + } + + /** + * set the format on bootstrap templates in dropdown programmatically + * + * @name TopNav.setFormat + * @function + */ + me.setFormat = function(format) + { + $formatter.parent().find(`a[data-format="${format}"]`).click(); + } + + /** + * returns if attachment dropdown is readonly, not editable + * + * @name TopNav.isAttachmentReadonly + * @function + * @return {bool} + */ + me.isAttachmentReadonly = function() + { + return $attach.hasClass('hidden'); + } + + /** + * init navigation manager + * + * preloads jQuery elements + * + * @name TopNav.init + * @function + */ + me.init = function() + { + $attach = $('#attach'); + $burnAfterReading = $('#burnafterreading'); + $burnAfterReadingOption = $('#burnafterreadingoption'); + $cloneButton = $('#clonebutton'); + $customAttachment = $('#customattachment'); + $expiration = $('#expiration'); + $fileRemoveButton = $('#fileremovebutton'); + $fileWrap = $('#filewrap'); + $formatter = $('#formatter'); + $newButton = $('#newbutton'); + $openDiscussion = $('#opendiscussion'); + $openDiscussionOption = $('#opendiscussionoption'); + $password = $('#password'); + $passwordInput = $('#passwordinput'); + $rawTextButton = $('#rawtextbutton'); + $retryButton = $('#retrybutton'); + $sendButton = $('#sendbutton'); + $qrCodeLink = $('#qrcodelink'); + $emailLink = $('#emaillink'); + + // bootstrap template drop down + $('#language ul.dropdown-menu li a').click(setLanguage); + // page template drop down + $('#language select option').click(setLanguage); + + // bind events + $burnAfterReading.change(changeBurnAfterReading); + $openDiscussionOption.change(changeOpenDiscussion); + $newButton.click(clickNewPaste); + $sendButton.click(PasteEncrypter.sendPaste); + $cloneButton.click(Controller.clonePaste); + $rawTextButton.click(rawText); + $retryButton.click(clickRetryButton); + $fileRemoveButton.click(removeAttachment); + $qrCodeLink.click(displayQrCode); + + // bootstrap template drop downs + $('ul.dropdown-menu li a', $('#expiration').parent()).click(updateExpiration); + $('ul.dropdown-menu li a', $('#formatter').parent()).click(updateFormat); + + // initiate default state of checkboxes + changeBurnAfterReading(); + changeOpenDiscussion(); + + // get default value from template or fall back to set value + pasteExpiration = Model.getExpirationDefault() || pasteExpiration; + + createButtonsDisplayed = false; + viewButtonsDisplayed = false; + }; + + return me; + })(window, document); + + /** + * Responsible for AJAX requests, transparently handles encryption… + * + * @name ServerInteraction + * @class + */ + const ServerInteraction = (function () { + const me = {}; + + let successFunc = null, + failureFunc = null, + symmetricKey = null, + url, + data, + password; + + /** + * public variable ('constant') for errors to prevent magic numbers + * + * @name ServerInteraction.error + * @readonly + * @enum {Object} + */ + me.error = { + okay: 0, + custom: 1, + unknown: 2, + serverError: 3 + }; + + /** + * ajaxHeaders to send in AJAX requests + * + * @name ServerInteraction.ajaxHeaders + * @private + * @readonly + * @enum {Object} + */ + const ajaxHeaders = {'X-Requested-With': 'JSONHttpRequest'}; + + /** + * called after successful upload + * + * @name ServerInteraction.success + * @private + * @function + * @param {int} status + * @param {int} result - optional + */ + function success(status, result) + { + if (successFunc !== null) { + // add useful data to result + result.encryptionKey = symmetricKey; + successFunc(status, result); + } + } + + /** + * called after a upload failure + * + * @name ServerInteraction.fail + * @private + * @function + * @param {int} status - internal code + * @param {int} result - original error code + */ + function fail(status, result) + { + if (failureFunc !== null) { + failureFunc(status, result); + } + } + + /** + * actually uploads the data + * + * @name ServerInteraction.run + * @function + */ + me.run = function() + { + let isPost = Object.keys(data).length > 0, + ajaxParams = { + type: isPost ? 'POST' : 'GET', + url: url, + headers: ajaxHeaders, + dataType: 'json', + success: function(result) { + if (result.status === 0) { + success(0, result); + } else if (result.status === 1) { + fail(1, result); + } else { + fail(2, result); + } + } + }; + if (isPost) { + ajaxParams.data = JSON.stringify(data); + } + $.ajax(ajaxParams).fail(function(jqXHR, textStatus, errorThrown) { + console.error(textStatus, errorThrown); + fail(3, jqXHR); + }); + }; + + /** + * return currently set data, used in unit testing + * + * @name ServerInteraction.getData + * @function + */ + me.getData = function() + { + return data; + }; + + /** + * set success function + * + * @name ServerInteraction.setUrl + * @function + * @param {function} newUrl + */ + me.setUrl = function(newUrl) + { + url = newUrl; + }; + + /** + * sets the password to use (first value) and optionally also the + * encryption key (not recommended, it is automatically generated). + * + * Note: Call this after prepare() as prepare() resets these values. + * + * @name ServerInteraction.setCryptValues + * @function + * @param {string} newPassword + * @param {string} newKey - optional + */ + me.setCryptParameters = function(newPassword, newKey) + { + password = newPassword; + + if (typeof newKey !== 'undefined') { + symmetricKey = newKey; + } + }; + + /** + * set success function + * + * @name ServerInteraction.setSuccess + * @function + * @param {function} func + */ + me.setSuccess = function(func) + { + successFunc = func; + }; + + /** + * set failure function + * + * @name ServerInteraction.setFailure + * @function + * @param {function} func + */ + me.setFailure = function(func) + { + failureFunc = func; + }; + + /** + * prepares a new upload + * + * Call this when doing a new upload to reset any data from potential + * previous uploads. Must be called before any other method of this + * module. + * + * @name ServerInteraction.prepare + * @function + * @return {object} + */ + me.prepare = function() + { + // entropy should already be checked! + + // reset password + password = ''; + + // reset key, so it a new one is generated when it is used + symmetricKey = null; + + // reset data + successFunc = null; + failureFunc = null; + url = Helper.baseUri(); + data = {}; + }; + + /** + * encrypts and sets the data + * + * @name ServerInteraction.setCipherMessage + * @async + * @function + * @param {object} cipherMessage + */ + me.setCipherMessage = async function(cipherMessage) + { + if ( + symmetricKey === null || + (typeof symmetricKey === 'string' && symmetricKey === '') + ) { + symmetricKey = CryptTool.getSymmetricKey(); + } + if (!data.hasOwnProperty('adata')) { + data['adata'] = []; + } + let cipherResult = await CryptTool.cipher(symmetricKey, password, JSON.stringify(cipherMessage), data['adata']); + data['v'] = 2; + data['ct'] = cipherResult[0]; + data['adata'] = cipherResult[1]; + + }; + + /** + * set the additional metadata to send unencrypted + * + * @name ServerInteraction.setUnencryptedData + * @function + * @param {string} index + * @param {mixed} element + */ + me.setUnencryptedData = function(index, element) + { + data[index] = element; + }; + + /** + * Helper, which parses shows a general error message based on the result of the ServerInteraction + * + * @name ServerInteraction.parseUploadError + * @function + * @param {int} status + * @param {object} data + * @param {string} doThisThing - a human description of the action, which was tried + * @return {array} + */ + me.parseUploadError = function(status, data, doThisThing) { + let errorArray; + + switch (status) { + case me.error.custom: + errorArray = ['Could not ' + doThisThing + ': %s', data.message]; + break; + case me.error.unknown: + errorArray = ['Could not ' + doThisThing + ': %s', I18n._('unknown status')]; + break; + case me.error.serverError: + errorArray = ['Could not ' + doThisThing + ': %s', I18n._('server error or not responding')]; + break; + default: + errorArray = ['Could not ' + doThisThing + ': %s', I18n._('unknown error')]; + break; + } + + return errorArray; + }; + + return me; + })(); + + /** + * (controller) Responsible for encrypting paste and sending it to server. + * + * Does upload, encryption is done transparently by ServerInteraction. + * + * @name PasteEncrypter + * @class + */ + const PasteEncrypter = (function () { + const me = {}; + + /** + * called after successful paste upload + * + * @name PasteEncrypter.showCreatedPaste + * @private + * @function + * @param {int} status + * @param {object} data + */ + function showCreatedPaste(status, data) { + Alert.hideLoading(); + Alert.hideMessages(); + + // show notification + const baseUri = Helper.baseUri() + '?', + url = baseUri + data.id + '#' + CryptTool.base58encode(data.encryptionKey), + deleteUrl = baseUri + 'pasteid=' + data.id + '&deletetoken=' + data.deletetoken; + PasteStatus.createPasteNotification(url, deleteUrl); + + // show new URL in browser bar + history.pushState({type: 'newpaste'}, document.title, url); + + TopNav.showViewButtons(); + + // this cannot be grouped with showViewButtons due to remaining time calculation + TopNav.showEmailButton(); + + TopNav.hideRawButton(); + Editor.hide(); + + // parse and show text + // (preparation already done in me.sendPaste()) + PasteViewer.run(); + } + + /** + * called after successful comment upload + * + * @name PasteEncrypter.showUploadedComment + * @private + * @function + * @param {int} status + * @param {object} data + */ + function showUploadedComment(status, data) { + // show success message + Alert.showStatus('Comment posted.'); + + // reload paste + Controller.refreshPaste(function () { + // highlight sent comment + DiscussionViewer.highlightComment(data.id, true); + // reset error handler + Alert.setCustomHandler(null); + }); + } + + /** + * send a reply in a discussion + * + * @name PasteEncrypter.sendComment + * @async + * @function + */ + me.sendComment = async function() + { + Alert.hideMessages(); + Alert.setCustomHandler(DiscussionViewer.handleNotification); + + // UI loading state + TopNav.hideAllButtons(); + Alert.showLoading('Sending comment…', 'cloud-upload'); + + // get data + const plainText = DiscussionViewer.getReplyMessage(), + nickname = DiscussionViewer.getReplyNickname(), + parentid = DiscussionViewer.getReplyCommentId(); + + // do not send if there is no data + if (plainText.length === 0) { + // revert loading status… + Alert.hideLoading(); + Alert.setCustomHandler(null); + TopNav.showViewButtons(); + return; + } + + // prepare server interaction + ServerInteraction.prepare(); + ServerInteraction.setCryptParameters(Prompt.getPassword(), Model.getPasteKey()); + + // set success/fail functions + ServerInteraction.setSuccess(showUploadedComment); + ServerInteraction.setFailure(function (status, data) { + // revert loading status… + Alert.hideLoading(); + TopNav.showViewButtons(); + + // …show error message… + Alert.showError( + ServerInteraction.parseUploadError(status, data, 'post comment') + ); + + // …and reset error handler + Alert.setCustomHandler(null); + }); + + // fill it with unencrypted params + ServerInteraction.setUnencryptedData('pasteid', Model.getPasteId()); + if (typeof parentid === 'undefined') { + // if parent id is not set, this is the top-most comment, so use + // paste id as parent, as the root element of the discussion tree + ServerInteraction.setUnencryptedData('parentid', Model.getPasteId()); + } else { + ServerInteraction.setUnencryptedData('parentid', parentid); + } + + // prepare cypher message + let cipherMessage = { + 'comment': plainText + }; + if (nickname.length > 0) { + cipherMessage['nickname'] = nickname; + } + + await ServerInteraction.setCipherMessage(cipherMessage).catch(Alert.showError); + ServerInteraction.run(); + }; + + /** + * sends a new paste to server + * + * @name PasteEncrypter.sendPaste + * @async + * @function + */ + me.sendPaste = async function() + { + // hide previous (error) messages + Controller.hideStatusMessages(); + + // UI loading state + TopNav.hideAllButtons(); + Alert.showLoading('Sending paste…', 'cloud-upload'); + TopNav.collapseBar(); + + // get data + const plainText = Editor.getText(), + format = PasteViewer.getFormat(), + // the methods may return different values if no files are attached (null, undefined or false) + files = TopNav.getFileList() || AttachmentViewer.getFile() || AttachmentViewer.hasAttachment(); + + // do not send if there is no data + if (plainText.length === 0 && !files) { + // revert loading status… + Alert.hideLoading(); + TopNav.showCreateButtons(); + return; + } + + // prepare server interaction + ServerInteraction.prepare(); + ServerInteraction.setCryptParameters(TopNav.getPassword()); + + // set success/fail functions + ServerInteraction.setSuccess(showCreatedPaste); + ServerInteraction.setFailure(function (status, data) { + // revert loading status… + Alert.hideLoading(); + TopNav.showCreateButtons(); + + // show error message + Alert.showError( + ServerInteraction.parseUploadError(status, data, 'create paste') + ); + }); + + // fill it with unencrypted submitted options + ServerInteraction.setUnencryptedData('adata', [ + null, format, + TopNav.getOpenDiscussion() ? 1 : 0, + TopNav.getBurnAfterReading() ? 1 : 0 + ]); + ServerInteraction.setUnencryptedData('meta', {'expire': TopNav.getExpiration()}); + + // prepare PasteViewer for later preview + PasteViewer.setText(plainText); + PasteViewer.setFormat(format); + + // prepare cypher message + let file = AttachmentViewer.getAttachmentData(), + cipherMessage = { + 'paste': plainText + }; + if (typeof file !== 'undefined' && file !== null) { + cipherMessage['attachment'] = file; + cipherMessage['attachment_name'] = AttachmentViewer.getFile().name; + } else if (AttachmentViewer.hasAttachment()) { + // fall back to cloned part + let attachment = AttachmentViewer.getAttachment(); + cipherMessage['attachment'] = attachment[0]; + cipherMessage['attachment_name'] = attachment[1]; + + // we need to retrieve data from blob if browser already parsed it in memory + if (typeof attachment[0] === 'string' && attachment[0].startsWith('blob:')) { + Alert.showStatus( + [ + 'Retrieving cloned file \'%s\' from memory...', + attachment[1] + ], + 'copy' + ); + try { + const blobData = await $.ajax({ + type: 'GET', + url: `${attachment[0]}`, + processData: false, + timeout: 10000, + xhrFields: { + withCredentials: false, + responseType: 'blob' + } + }); + if (blobData instanceof window.Blob) { + const fileReading = new Promise(function(resolve, reject) { + const fileReader = new FileReader(); + fileReader.onload = function (event) { + resolve(event.target.result); + }; + fileReader.onerror = function (error) { + reject(error); + } + fileReader.readAsDataURL(blobData); + }); + cipherMessage['attachment'] = await fileReading; + } else { + const error = 'Cannot process attachment data.'; + Alert.showError(error); + throw new TypeError(error); + } + } catch (error) { + console.error(error); + Alert.showError('Cannot retrieve attachment.'); + throw error; + } + } + } + + // encrypt message + await ServerInteraction.setCipherMessage(cipherMessage).catch(Alert.showError); + + // send data + ServerInteraction.run(); + }; + + return me; + })(); + + /** + * (controller) Responsible for decrypting cipherdata and passing data to view. + * + * Only decryption, no download. + * + * @name PasteDecrypter + * @class + */ + const PasteDecrypter = (function () { + const me = {}; + + /** + * decrypt data or prompts for password in case of failure + * + * @name PasteDecrypter.decryptOrPromptPassword + * @private + * @async + * @function + * @param {string} key + * @param {string} password - optional, may be an empty string + * @param {string} cipherdata + * @throws {string} + * @return {false|string} false, when unsuccessful or string (decrypted data) + */ + async function decryptOrPromptPassword(key, password, cipherdata) + { + // try decryption without password + const plaindata = await CryptTool.decipher(key, password, cipherdata); + + // if it fails, request password + if (plaindata.length === 0 && password.length === 0) { + // show prompt + Prompt.requestPassword(); + + // Thus, we cannot do anything yet, we need to wait for the user + // input. + return false; + } + + // if all tries failed, we can only return an error + if (plaindata.length === 0) { + return false; + } + + return plaindata; + } + + /** + * decrypt the actual paste text + * + * @name PasteDecrypter.decryptPaste + * @private + * @async + * @function + * @param {Paste} paste - paste data in object form + * @param {string} key + * @param {string} password + * @throws {string} + * @return {Promise} + */ + async function decryptPaste(paste, key, password) + { + let pastePlain = await decryptOrPromptPassword( + key, password, + paste.getCipherData() + ); + if (pastePlain === false) { + if (password.length === 0) { + throw 'waiting on user to provide a password'; + } else { + Alert.hideLoading(); + // reset password, so it can be re-entered + Prompt.reset(); + TopNav.showRetryButton(); + throw 'Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.'; + } + } + + if (paste.v > 1) { + // version 2 paste + const pasteMessage = JSON.parse(pastePlain); + if (pasteMessage.hasOwnProperty('attachment') && pasteMessage.hasOwnProperty('attachment_name')) { + AttachmentViewer.setAttachment(pasteMessage.attachment, pasteMessage.attachment_name); + AttachmentViewer.showAttachment(); + } + pastePlain = pasteMessage.paste; + } else { + // version 1 paste + if (paste.hasOwnProperty('attachment') && paste.hasOwnProperty('attachmentname')) { + Promise.all([ + CryptTool.decipher(key, password, paste.attachment), + CryptTool.decipher(key, password, paste.attachmentname) + ]).then((attachment) => { + AttachmentViewer.setAttachment(attachment[0], attachment[1]); + AttachmentViewer.showAttachment(); + }); + } + } + PasteViewer.setFormat(paste.getFormat()); + PasteViewer.setText(pastePlain); + PasteViewer.run(); + } + + /** + * decrypts all comments and shows them + * + * @name PasteDecrypter.decryptComments + * @private + * @async + * @function + * @param {Paste} paste - paste data in object form + * @param {string} key + * @param {string} password + * @return {Promise} + */ + async function decryptComments(paste, key, password) + { + // remove potential previous discussion + DiscussionViewer.prepareNewDiscussion(); + + const commentDecryptionPromises = []; + // iterate over comments + for (let i = 0; i < paste.comments.length; ++i) { + const comment = new Comment(paste.comments[i]), + commentPromise = CryptTool.decipher(key, password, comment.getCipherData()); + paste.comments[i] = comment; + if (comment.v > 1) { + // version 2 comment + commentDecryptionPromises.push( + commentPromise.then(function (commentJson) { + const commentMessage = JSON.parse(commentJson); + return [ + commentMessage.comment || '', + commentMessage.nickname || '' + ]; + }) + ); + } else { + // version 1 comment + commentDecryptionPromises.push( + Promise.all([ + commentPromise, + paste.comments[i].meta.hasOwnProperty('nickname') ? + CryptTool.decipher(key, password, paste.comments[i].meta.nickname) : + Promise.resolve('') + ]) + ); + } + } + return Promise.all(commentDecryptionPromises).then(function (plaintexts) { + for (let i = 0; i < paste.comments.length; ++i) { + if (plaintexts[i][0].length === 0) { + continue; + } + DiscussionViewer.addComment( + paste.comments[i], + plaintexts[i][0], + plaintexts[i][1] + ); + } + }); + } + + /** + * show decrypted text in the display area, including discussion (if open) + * + * @name PasteDecrypter.run + * @function + * @param {Paste} [paste] - (optional) object including comments to display (items = array with keys ('data','meta')) + */ + me.run = function(paste) + { + Alert.hideMessages(); + Alert.showLoading('Decrypting paste…', 'cloud-download'); + + if (typeof paste === 'undefined') { + // get cipher data and wait until it is available + Model.getPasteData(me.run); + return; + } + + let key = Model.getPasteKey(), + password = Prompt.getPassword(), + decryptionPromises = []; + + TopNav.setRetryCallback(function () { + TopNav.hideRetryButton(); + me.run(paste); + }); + + // decrypt paste & attachments + decryptionPromises.push(decryptPaste(paste, key, password)); + + // if the discussion is opened on this paste, display it + if (paste.isDiscussionEnabled()) { + decryptionPromises.push(decryptComments(paste, key, password)); + } + + // shows the remaining time (until) deletion + PasteStatus.showRemainingTime(paste); + + Promise.all(decryptionPromises) + .then(() => { + Alert.hideLoading(); + TopNav.showViewButtons(); + + // discourage cloning (it cannot really be prevented) + if (paste.isBurnAfterReadingEnabled()) { + TopNav.hideBurnAfterReadingButtons(); + } else { + // we have to pass in remaining_time here + TopNav.showEmailButton(paste.getTimeToLive()); + } + + // only offer adding comments, after paste was successfully decrypted + if (paste.isDiscussionEnabled()) { + DiscussionViewer.finishDiscussion(); + } + + }) + .catch((err) => { + // wait for the user to type in the password, + // then PasteDecrypter.run will be called again + Alert.showError(err); + }); + }; + + return me; + })(); + + /** + * (controller) main PrivateBin logic + * + * @name Controller + * @param {object} window + * @param {object} document + * @class + */ + const Controller = (function (window, document) { + const me = {}; + + /** + * hides all status messages no matter which module showed them + * + * @name Controller.hideStatusMessages + * @function + */ + me.hideStatusMessages = function() + { + PasteStatus.hideMessages(); + Alert.hideMessages(); + }; + + /** + * creates a new paste + * + * @name Controller.newPaste + * @function + */ + me.newPaste = function() + { + // Important: This *must not* run Alert.hideMessages() as previous + // errors from viewing a paste should be shown. + TopNav.hideAllButtons(); + Alert.showLoading('Preparing new paste…', 'time'); + + PasteStatus.hideMessages(); + PasteViewer.hide(); + Editor.resetInput(); + Editor.show(); + Editor.focusInput(); + AttachmentViewer.removeAttachment(); + + TopNav.showCreateButtons(); + + // newPaste could be called when user is on paste clone editing view + TopNav.hideCustomAttachment(); + AttachmentViewer.clearDragAndDrop(); + AttachmentViewer.removeAttachmentData(); + + Alert.hideLoading(); + history.pushState({type: 'create'}, document.title, Helper.baseUri()); + + // clear discussion + DiscussionViewer.prepareNewDiscussion(); + }; + + /** + * shows the loaded paste + * + * @name Controller.showPaste + * @function + */ + me.showPaste = function() + { + try { + Model.getPasteKey(); + } catch (err) { + console.error(err); + + // missing decryption key (or paste ID) in URL? + if (window.location.hash.length === 0) { + Alert.showError('Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)'); + return; + } + } + + // show proper elements on screen + PasteDecrypter.run(); + }; + + /** + * refreshes the loaded paste to show potential new data + * + * @name Controller.refreshPaste + * @function + * @param {function} callback + */ + me.refreshPaste = function(callback) + { + // save window position to restore it later + const orgPosition = $(window).scrollTop(); + + Model.getPasteData(function (data) { + ServerInteraction.prepare(); + ServerInteraction.setUrl(Helper.baseUri() + '?pasteid=' + Model.getPasteId()); + + ServerInteraction.setFailure(function (status, data) { + // revert loading status… + Alert.hideLoading(); + TopNav.showViewButtons(); + + // show error message + Alert.showError( + ServerInteraction.parseUploadError(status, data, 'refresh display') + ); + }); + ServerInteraction.setSuccess(function (status, data) { + PasteDecrypter.run(new Paste(data)); + + // restore position + window.scrollTo(0, orgPosition); + + // NOTE: could create problems as callback may be called + // asyncronously if PasteDecrypter e.g. needs to wait for a + // password being entered + callback(); + }); + ServerInteraction.run(); + }, false); // this false is important as it circumvents the cache + } + + /** + * clone the current paste + * + * @name Controller.clonePaste + * @function + */ + me.clonePaste = function() + { + TopNav.collapseBar(); + TopNav.hideAllButtons(); + + // hide messages from previous paste + me.hideStatusMessages(); + + // erase the id and the key in url + history.pushState({type: 'clone'}, document.title, Helper.baseUri()); + + if (AttachmentViewer.hasAttachment()) { + AttachmentViewer.moveAttachmentTo( + TopNav.getCustomAttachment(), + 'Cloned: \'%s\'' + ); + TopNav.hideFileSelector(); + AttachmentViewer.hideAttachment(); + // NOTE: it also looks nice without removing the attachment + // but for a consistent display we remove it… + AttachmentViewer.hideAttachmentPreview(); + TopNav.showCustomAttachment(); + + // show another status message to make the user aware that the + // file was cloned too! + Alert.showStatus( + [ + 'The cloned file \'%s\' was attached to this paste.', + AttachmentViewer.getAttachment()[1] + ], + 'copy' + ); + } + + Editor.setText(PasteViewer.getText()); + // also clone the format + TopNav.setFormat(PasteViewer.getFormat()); + PasteViewer.hide(); + Editor.show(); + + TopNav.showCreateButtons(); + + // clear discussion + DiscussionViewer.prepareNewDiscussion(); + }; + + /** + * try initializing zlib or display a warning if it fails, + * extracted from main init to allow unit testing + * + * @name Controller.initZ + * @function + */ + me.initZ = function() + { + z = zlib.catch(function () { + if ($('body').data('compression') !== 'none') { + Alert.showWarning('Your browser doesn\'t support WebAssembly, used for zlib compression. You can create uncompressed documents, but can\'t read compressed ones.'); + } + }); + } + + /** + * application start + * + * @name Controller.init + * @function + */ + me.init = function() + { + // first load translations + I18n.loadTranslations(); + + DOMPurify.setConfig({SAFE_FOR_JQUERY: true}); + + // center all modals + $('.modal').on('show.bs.modal', function(e) { + $(e.target).css({ + display: 'flex' + }); + }); + + // initialize other modules/"classes" + Alert.init(); + Model.init(); + AttachmentViewer.init(); + DiscussionViewer.init(); + Editor.init(); + PasteStatus.init(); + PasteViewer.init(); + Prompt.init(); + TopNav.init(); + UiHelper.init(); + + // check for legacy browsers before going any further + if (!Legacy.Check.getInit()) { + // Legacy check didn't complete, wait and try again + setTimeout(init, 500); + return; + } + if (!Legacy.Check.getStatus()) { + // something major is wrong, stop right away + return; + } + me.initZ(); + + // check whether existing paste needs to be shown + try { + Model.getPasteId(); + } catch (e) { + // otherwise create a new paste + return me.newPaste(); + } + + // if delete token is passed (i.e. paste has been deleted by this + // access), there is nothing more to do + if (Model.hasDeleteToken()) { + return; + } + + // display an existing paste + return me.showPaste(); + } + + return me; + })(window, document); + + return { + Helper: Helper, + I18n: I18n, + CryptTool: CryptTool, + Model: Model, + UiHelper: UiHelper, + Alert: Alert, + PasteStatus: PasteStatus, + Prompt: Prompt, + Editor: Editor, + PasteViewer: PasteViewer, + AttachmentViewer: AttachmentViewer, + DiscussionViewer: DiscussionViewer, + TopNav: TopNav, + ServerInteraction: ServerInteraction, + PasteEncrypter: PasteEncrypter, + PasteDecrypter: PasteDecrypter, + Controller: Controller + }; +})(jQuery, RawDeflate); diff --git a/js/purify-2.0.7.js b/js/purify-2.0.7.js new file mode 100644 index 00000000..815d4b89 --- /dev/null +++ b/js/purify-2.0.7.js @@ -0,0 +1 @@ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.DOMPurify=t()}(this,function(){"use strict";function e(e,t){y&&y(e,null);for(var n=t.length;n--;){var r=t[n];if("string"==typeof r){var o=r.toLowerCase();o!==r&&(Object.isFrozen(t)||(t[n]=o),r=o)}e[r]=!0}return e}function t(e){var t={},n=void 0;for(n in e)g(h,e,[n])&&(t[n]=e[n]);return t}function n(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t0&&void 0!==arguments[0]?arguments[0]:O(),u=function(e){return r(e)};if(u.version="2.0.7",u.removed=[],!o||!o.document||9!==o.document.nodeType)return u.isSupported=!1,u;var h=o.document,y=!1,g=!1,v=o.document,R=o.DocumentFragment,D=o.HTMLTemplateElement,C=o.Node,H=o.NodeFilter,F=o.NamedNodeMap,z=void 0===F?o.NamedNodeMap||o.MozNamedAttrMap:F,I=o.Text,j=o.Comment,U=o.DOMParser,P=o.TrustedTypes;if("function"==typeof D){var W=v.createElement("template");W.content&&W.content.ownerDocument&&(v=W.content.ownerDocument)}var B=N(P,h),q=B?B.createHTML(""):"",G=v,V=G.implementation,Y=G.createNodeIterator,K=G.getElementsByTagName,X=G.createDocumentFragment,$=h.importNode,J={};u.isSupported=V&&void 0!==V.createHTMLDocument&&9!==v.documentMode;var Q=b,Z=T,ee=A,te=x,ne=L,re=E,oe=S,ie=null,ae=e({},[].concat(n(i),n(a),n(l),n(s),n(c))),le=null,se=e({},[].concat(n(d),n(f),n(m),n(p))),ce=null,ue=null,de=!0,fe=!0,me=!1,pe=!1,he=!1,ye=!1,ge=!1,ve=!1,be=!1,Te=!1,Ae=!1,xe=!1,Se=!0,Le=!0,Ee=!1,Me={},ke=e({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","plaintext","script","style","svg","template","thead","title","video","xmp"]),we=e({},["audio","video","img","source","image"]),_e=null,Oe=e({},["alt","class","for","id","label","name","pattern","placeholder","summary","title","value","style","xmlns"]),Ne=null,Re=v.createElement("form"),De=function(r){Ne&&Ne===r||(r&&"object"===(void 0===r?"undefined":M(r))||(r={}),ie="ALLOWED_TAGS"in r?e({},r.ALLOWED_TAGS):ae,le="ALLOWED_ATTR"in r?e({},r.ALLOWED_ATTR):se,_e="ADD_URI_SAFE_ATTR"in r?e(t(Oe),r.ADD_URI_SAFE_ATTR):Oe,ce="FORBID_TAGS"in r?e({},r.FORBID_TAGS):{},ue="FORBID_ATTR"in r?e({},r.FORBID_ATTR):{},Me="USE_PROFILES"in r&&r.USE_PROFILES,de=!1!==r.ALLOW_ARIA_ATTR,fe=!1!==r.ALLOW_DATA_ATTR,me=r.ALLOW_UNKNOWN_PROTOCOLS||!1,pe=r.SAFE_FOR_JQUERY||!1,he=r.SAFE_FOR_TEMPLATES||!1,ye=r.WHOLE_DOCUMENT||!1,be=r.RETURN_DOM||!1,Te=r.RETURN_DOM_FRAGMENT||!1,Ae=r.RETURN_DOM_IMPORT||!1,xe=r.RETURN_TRUSTED_TYPE||!1,ve=r.FORCE_BODY||!1,Se=!1!==r.SANITIZE_DOM,Le=!1!==r.KEEP_CONTENT,Ee=r.IN_PLACE||!1,oe=r.ALLOWED_URI_REGEXP||oe,he&&(fe=!1),Te&&(be=!0),Me&&(ie=e({},[].concat(n(c))),le=[],!0===Me.html&&(e(ie,i),e(le,d)),!0===Me.svg&&(e(ie,a),e(le,f),e(le,p)),!0===Me.svgFilters&&(e(ie,l),e(le,f),e(le,p)),!0===Me.mathMl&&(e(ie,s),e(le,m),e(le,p))),r.ADD_TAGS&&(ie===ae&&(ie=t(ie)),e(ie,r.ADD_TAGS)),r.ADD_ATTR&&(le===se&&(le=t(le)),e(le,r.ADD_ATTR)),r.ADD_URI_SAFE_ATTR&&e(_e,r.ADD_URI_SAFE_ATTR),Le&&(ie["#text"]=!0),ye&&e(ie,["html","head","body"]),ie.table&&(e(ie,["tbody"]),delete ce.tbody),_&&_(r),Ne=r)},Ce=function(e){u.removed.push({element:e});try{e.parentNode.removeChild(e)}catch(t){e.outerHTML=q}},He=function(e,t){try{u.removed.push({attribute:t.getAttributeNode(e),from:t})}catch(e){u.removed.push({attribute:null,from:t})}t.removeAttribute(e)},Fe=function(t){var n=void 0,r=void 0;if(ve)t=""+t;else{var o=t.match(/^[\s]+/);(r=o&&o[0])&&(t=t.slice(r.length))}if(y)try{n=(new U).parseFromString(t,"text/html")}catch(e){}if(g&&e(ce,["title"]),!n||!n.documentElement){var i=(n=V.createHTMLDocument("")).body;i.parentNode.removeChild(i.parentNode.firstElementChild),i.outerHTML=B?B.createHTML(t):t}return t&&r&&n.body.insertBefore(v.createTextNode(r),n.body.childNodes[0]||null),K.call(n,ye?"html":"body")[0]};u.isSupported&&(function(){try{Fe('

').querySelector("svg img")&&(y=!0)}catch(e){}}(),function(){try{var e=Fe("</title><img>");/<\/title/.test(e.querySelector("title").innerHTML)&&(g=!0)}catch(e){}}());var ze=function(e){return Y.call(e.ownerDocument||e,e,H.SHOW_ELEMENT|H.SHOW_COMMENT|H.SHOW_TEXT,function(){return H.FILTER_ACCEPT},!1)},Ie=function(e){return!(e instanceof I||e instanceof j)&&!("string"==typeof e.nodeName&&"string"==typeof e.textContent&&"function"==typeof e.removeChild&&e.attributes instanceof z&&"function"==typeof e.removeAttribute&&"function"==typeof e.setAttribute&&"string"==typeof e.namespaceURI)},je=function(e){return"object"===(void 0===C?"undefined":M(C))?e instanceof C:e&&"object"===(void 0===e?"undefined":M(e))&&"number"==typeof e.nodeType&&"string"==typeof e.nodeName},Ue=function(e,t,n){J[e]&&J[e].forEach(function(e){e.call(u,t,n,Ne)})},Pe=function(e){var t=void 0;if(Ue("beforeSanitizeElements",e,null),Ie(e))return Ce(e),!0;var n=e.nodeName.toLowerCase();if(Ue("uponSanitizeElement",e,{tagName:n,allowedTags:ie}),("svg"===n||"math"===n)&&0!==e.querySelectorAll("p, br").length)return Ce(e),!0;if(!ie[n]||ce[n]){if(Le&&!ke[n]&&"function"==typeof e.insertAdjacentHTML)try{var r=e.innerHTML;e.insertAdjacentHTML("AfterEnd",B?B.createHTML(r):r)}catch(e){}return Ce(e),!0}return"noscript"===n&&/<\/noscript/i.test(e.innerHTML)?(Ce(e),!0):"noembed"===n&&/<\/noembed/i.test(e.innerHTML)?(Ce(e),!0):(!pe||e.firstElementChild||e.content&&e.content.firstElementChild||!/</g.test(e.textContent)||(u.removed.push({element:e.cloneNode()}),e.innerHTML?e.innerHTML=e.innerHTML.replace(/</g,"<"):e.innerHTML=e.textContent.replace(/</g,"<")),he&&3===e.nodeType&&(t=(t=(t=e.textContent).replace(Q," ")).replace(Z," "),e.textContent!==t&&(u.removed.push({element:e.cloneNode()}),e.textContent=t)),Ue("afterSanitizeElements",e,null),!1)},We=function(e,t,n){if(Se&&("id"===t||"name"===t)&&(n in v||n in Re))return!1;if(fe&&ee.test(t));else if(de&&te.test(t));else{if(!le[t]||ue[t])return!1;if(_e[t]);else if(oe.test(n.replace(re,"")));else if("src"!==t&&"xlink:href"!==t&&"href"!==t||"script"===e||0!==n.indexOf("data:")||!we[e]){if(me&&!ne.test(n.replace(re,"")));else if(n)return!1}else;}return!0},Be=function(e){var t=void 0,n=void 0,r=void 0,o=void 0,i=void 0;Ue("beforeSanitizeAttributes",e,null);var a=e.attributes;if(a){var l={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:le};for(i=a.length;i--;){var s=t=a[i],c=s.name,d=s.namespaceURI;if(n=t.value.trim(),r=c.toLowerCase(),l.attrName=r,l.attrValue=n,l.keepAttr=!0,Ue("uponSanitizeAttribute",e,l),n=l.attrValue,"name"===r&&"IMG"===e.nodeName&&a.id)o=a.id,a=k(w,a,[]),He("id",e),He(c,e),a.indexOf(o)>i&&e.setAttribute("id",o.value);else{if("INPUT"===e.nodeName&&"type"===r&&"file"===n&&l.keepAttr&&(le[r]||!ue[r]))continue;"id"===c&&e.setAttribute(c,""),He(c,e)}if(l.keepAttr)if(/svg|math/i.test(e.namespaceURI)&&new RegExp("</("+Object.keys(ke).join("|")+")","i").test(n))He(c,e);else{he&&(n=(n=n.replace(Q," ")).replace(Z," "));var f=e.nodeName.toLowerCase();if(We(f,r,n))try{d?e.setAttributeNS(d,c,n):e.setAttribute(c,n),u.removed.pop()}catch(e){}}}Ue("afterSanitizeAttributes",e,null)}},qe=function e(t){var n=void 0,r=ze(t);for(Ue("beforeSanitizeShadowDOM",t,null);n=r.nextNode();)Ue("uponSanitizeShadowNode",n,null),Pe(n)||(n.content instanceof R&&e(n.content),Be(n));Ue("afterSanitizeShadowDOM",t,null)};return u.sanitize=function(e,t){var n=void 0,r=void 0,i=void 0,a=void 0,l=void 0;if(e||(e="\x3c!--\x3e"),"string"!=typeof e&&!je(e)){if("function"!=typeof e.toString)throw new TypeError("toString is not a function");if("string"!=typeof(e=e.toString()))throw new TypeError("dirty is not a string, aborting")}if(!u.isSupported){if("object"===M(o.toStaticHTML)||"function"==typeof o.toStaticHTML){if("string"==typeof e)return o.toStaticHTML(e);if(je(e))return o.toStaticHTML(e.outerHTML)}return e}if(ge||De(t),u.removed=[],Ee);else if(e instanceof C)1===(r=(n=Fe("\x3c!--\x3e")).ownerDocument.importNode(e,!0)).nodeType&&"BODY"===r.nodeName?n=r:"HTML"===r.nodeName?n=r:n.appendChild(r);else{if(!be&&!he&&!ye&&xe&&-1===e.indexOf("<"))return B?B.createHTML(e):e;if(!(n=Fe(e)))return be?null:q}n&&ve&&Ce(n.firstChild);for(var s=ze(Ee?e:n);i=s.nextNode();)3===i.nodeType&&i===a||Pe(i)||(i.content instanceof R&&qe(i.content),Be(i),a=i);if(a=null,Ee)return e;if(be){if(Te)for(l=X.call(n.ownerDocument);n.firstChild;)l.appendChild(n.firstChild);else l=n;return Ae&&(l=$.call(h,l,!0)),l}var c=ye?n.outerHTML:n.innerHTML;return he&&(c=(c=c.replace(Q," ")).replace(Z," ")),B&&xe?B.createHTML(c):c},u.setConfig=function(e){De(e),ge=!0},u.clearConfig=function(){Ne=null,ge=!1},u.isValidAttribute=function(e,t,n){Ne||De({});var r=e.toLowerCase(),o=t.toLowerCase();return We(r,o,n)},u.addHook=function(e,t){"function"==typeof t&&(J[e]=J[e]||[],J[e].push(t))},u.removeHook=function(e){J[e]&&J[e].pop()},u.removeHooks=function(e){J[e]&&(J[e]=[])},u.removeAllHooks=function(){J={}},u}var o=Object.freeze||function(e){return e},i=o(["a","abbr","acronym","address","area","article","aside","audio","b","bdi","bdo","big","blink","blockquote","body","br","button","canvas","caption","center","cite","code","col","colgroup","content","data","datalist","dd","decorator","del","details","dfn","dir","div","dl","dt","element","em","fieldset","figcaption","figure","font","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","img","input","ins","kbd","label","legend","li","main","map","mark","marquee","menu","menuitem","meter","nav","nobr","ol","optgroup","option","output","p","pre","progress","q","rp","rt","ruby","s","samp","section","select","shadow","small","source","spacer","span","strike","strong","style","sub","summary","sup","table","tbody","td","template","textarea","tfoot","th","thead","time","tr","track","tt","u","ul","var","video","wbr"]),a=o(["svg","a","altglyph","altglyphdef","altglyphitem","animatecolor","animatemotion","animatetransform","audio","canvas","circle","clippath","defs","desc","ellipse","filter","font","g","glyph","glyphref","hkern","image","line","lineargradient","marker","mask","metadata","mpath","path","pattern","polygon","polyline","radialgradient","rect","stop","style","switch","symbol","text","textpath","title","tref","tspan","video","view","vkern"]),l=o(["feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence"]),s=o(["math","menclose","merror","mfenced","mfrac","mglyph","mi","mlabeledtr","mmultiscripts","mn","mo","mover","mpadded","mphantom","mroot","mrow","ms","mspace","msqrt","mstyle","msub","msup","msubsup","mtable","mtd","mtext","mtr","munder","munderover"]),c=o(["#text"]),u=Object.freeze||function(e){return e},d=u(["accept","action","align","alt","autocomplete","background","bgcolor","border","cellpadding","cellspacing","checked","cite","class","clear","color","cols","colspan","controls","coords","crossorigin","datetime","default","dir","disabled","download","enctype","face","for","headers","height","hidden","high","href","hreflang","id","integrity","ismap","label","lang","list","loop","low","max","maxlength","media","method","min","minlength","multiple","name","noshade","novalidate","nowrap","open","optimum","pattern","placeholder","poster","preload","pubdate","radiogroup","readonly","rel","required","rev","reversed","role","rows","rowspan","spellcheck","scope","selected","shape","size","sizes","span","srclang","start","src","srcset","step","style","summary","tabindex","title","type","usemap","valign","value","width","xmlns"]),f=u(["accent-height","accumulate","additive","alignment-baseline","ascent","attributename","attributetype","azimuth","basefrequency","baseline-shift","begin","bias","by","class","clip","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","cx","cy","d","dx","dy","diffuseconstant","direction","display","divisor","dur","edgemode","elevation","end","fill","fill-opacity","fill-rule","filter","filterunits","flood-color","flood-opacity","font-family","font-size","font-size-adjust","font-stretch","font-style","font-variant","font-weight","fx","fy","g1","g2","glyph-name","glyphref","gradientunits","gradienttransform","height","href","id","image-rendering","in","in2","k","k1","k2","k3","k4","kerning","keypoints","keysplines","keytimes","lang","lengthadjust","letter-spacing","kernelmatrix","kernelunitlength","lighting-color","local","marker-end","marker-mid","marker-start","markerheight","markerunits","markerwidth","maskcontentunits","maskunits","max","mask","media","method","mode","min","name","numoctaves","offset","operator","opacity","order","orient","orientation","origin","overflow","paint-order","path","pathlength","patterncontentunits","patterntransform","patternunits","points","preservealpha","preserveaspectratio","primitiveunits","r","rx","ry","radius","refx","refy","repeatcount","repeatdur","restart","result","rotate","scale","seed","shape-rendering","specularconstant","specularexponent","spreadmethod","stddeviation","stitchtiles","stop-color","stop-opacity","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke","stroke-width","style","surfacescale","tabindex","targetx","targety","transform","text-anchor","text-decoration","text-rendering","textlength","type","u1","u2","unicode","values","viewbox","visibility","version","vert-adv-y","vert-origin-x","vert-origin-y","width","word-spacing","wrap","writing-mode","xchannelselector","ychannelselector","x","x1","x2","xmlns","y","y1","y2","z","zoomandpan"]),m=u(["accent","accentunder","align","bevelled","close","columnsalign","columnlines","columnspan","denomalign","depth","dir","display","displaystyle","encoding","fence","frame","height","href","id","largeop","length","linethickness","lspace","lquote","mathbackground","mathcolor","mathsize","mathvariant","maxsize","minsize","movablelimits","notation","numalign","open","rowalign","rowlines","rowspacing","rowspan","rspace","rquote","scriptlevel","scriptminsize","scriptsizemultiplier","selection","separator","separators","stretchy","subscriptshift","supscriptshift","symmetric","voffset","width","xmlns"]),p=u(["xlink:href","xml:id","xlink:title","xml:space","xmlns:xlink"]),h=Object.hasOwnProperty,y=Object.setPrototypeOf,g=("undefined"!=typeof Reflect&&Reflect).apply;g||(g=function(e,t,n){return e.apply(t,n)});var v=Object.seal||function(e){return e},b=v(/\{\{[\s\S]*|[\s\S]*\}\}/gm),T=v(/<%[\s\S]*|[\s\S]*%>/gm),A=v(/^data-[\-\w.\u00B7-\uFFFF]/),x=v(/^aria-[\-\w]+$/),S=v(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),L=v(/^(?:\w+script|data):/i),E=v(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205f\u3000]/g),M="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},k=("undefined"!=typeof Reflect&&Reflect).apply,w=Array.prototype.slice,_=Object.freeze,O=function(){return"undefined"==typeof window?null:window};k||(k=function(e,t,n){return e.apply(t,n)});var N=function(e,t){if("object"!==(void 0===e?"undefined":M(e))||"function"!=typeof e.createPolicy)return null;var n=null;t.currentScript&&t.currentScript.hasAttribute("data-tt-policy-suffix")&&(n=t.currentScript.getAttribute("data-tt-policy-suffix"));var r="dompurify"+(n?"#"+n:"");try{return e.createPolicy(r,{createHTML:function(e){return e}})}catch(e){return console.warn("TrustedTypes policy "+r+" could not be created."),null}};return r()}); diff --git a/js/rawinflate-0.3.js b/js/rawinflate-0.3.js new file mode 100644 index 00000000..d3ac0e01 --- /dev/null +++ b/js/rawinflate-0.3.js @@ -0,0 +1,755 @@ +/* + * $Id: rawinflate.js,v 0.3 2013/04/09 14:25:38 dankogai Exp dankogai $ + * + * GNU General Public License, version 2 (GPL-2.0) + * https://opensource.org/licenses/GPL-2.0 + * original: + * http://www.onicos.com/staff/iz/amuse/javascript/expert/inflate.txt + */ + +(function(ctx){ + +/* Copyright (C) 1999 Masanao Izumo <iz@onicos.co.jp> + * Version: 1.0.0.1 + * LastModified: Dec 25 1999 + */ + +/* Interface: + * data = zip_inflate(src); + */ + +/* constant parameters */ +var zip_WSIZE = 32768; // Sliding Window size +var zip_STORED_BLOCK = 0; +var zip_STATIC_TREES = 1; +var zip_DYN_TREES = 2; + +/* for inflate */ +var zip_lbits = 9; // bits in base literal/length lookup table +var zip_dbits = 6; // bits in base distance lookup table +var zip_INBUFSIZ = 32768; // Input buffer size +var zip_INBUF_EXTRA = 64; // Extra buffer + +/* variables (inflate) */ +var zip_slide; +var zip_wp; // current position in slide +var zip_fixed_tl = null; // inflate static +var zip_fixed_td; // inflate static +var zip_fixed_bl, fixed_bd; // inflate static +var zip_bit_buf; // bit buffer +var zip_bit_len; // bits in bit buffer +var zip_method; +var zip_eof; +var zip_copy_leng; +var zip_copy_dist; +var zip_tl, zip_td; // literal/length and distance decoder tables +var zip_bl, zip_bd; // number of bits decoded by tl and td + +var zip_inflate_data; +var zip_inflate_pos; + + +/* constant tables (inflate) */ +var zip_MASK_BITS = new Array( + 0x0000, + 0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff, + 0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff); +// Tables for deflate from PKZIP's appnote.txt. +var zip_cplens = new Array( // Copy lengths for literal codes 257..285 + 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, + 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0); +/* note: see note #13 above about the 258 in this list. */ +var zip_cplext = new Array( // Extra bits for literal codes 257..285 + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, + 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 99, 99); // 99==invalid +var zip_cpdist = new Array( // Copy offsets for distance codes 0..29 + 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, + 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, + 8193, 12289, 16385, 24577); +var zip_cpdext = new Array( // Extra bits for distance codes + 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, + 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, + 12, 12, 13, 13); +var zip_border = new Array( // Order of the bit length code lengths + 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15); +/* objects (inflate) */ + +var zip_HuftList = function() { + this.next = null; + this.list = null; +} + +var zip_HuftNode = function() { + this.e = 0; // number of extra bits or operation + this.b = 0; // number of bits in this code or subcode + + // union + this.n = 0; // literal, length base, or distance base + this.t = null; // (zip_HuftNode) pointer to next level of table +} + +var zip_HuftBuild = function(b, // code lengths in bits (all assumed <= BMAX) + n, // number of codes (assumed <= N_MAX) + s, // number of simple-valued codes (0..s-1) + d, // list of base values for non-simple codes + e, // list of extra bits for non-simple codes + mm // maximum lookup bits + ) { + this.BMAX = 16; // maximum bit length of any code + this.N_MAX = 288; // maximum number of codes in any set + this.status = 0; // 0: success, 1: incomplete table, 2: bad input + this.root = null; // (zip_HuftList) starting table + this.m = 0; // maximum lookup bits, returns actual + +/* Given a list of code lengths and a maximum table size, make a set of + tables to decode that set of codes. Return zero on success, one if + the given code set is incomplete (the tables are still built in this + case), two if the input is invalid (all zero length codes or an + oversubscribed set of lengths), and three if not enough memory. + The code with value 256 is special, and the tables are constructed + so that no bits beyond that code are fetched when that code is + decoded. */ + { + var a; // counter for codes of length k + var c = new Array(this.BMAX+1); // bit length count table + var el; // length of EOB code (value 256) + var f; // i repeats in table every f entries + var g; // maximum code length + var h; // table level + var i; // counter, current code + var j; // counter + var k; // number of bits in current code + var lx = new Array(this.BMAX+1); // stack of bits per table + var p; // pointer into c[], b[], or v[] + var pidx; // index of p + var q; // (zip_HuftNode) points to current table + var r = new zip_HuftNode(); // table entry for structure assignment + var u = new Array(this.BMAX); // zip_HuftNode[BMAX][] table stack + var v = new Array(this.N_MAX); // values in order of bit length + var w; + var x = new Array(this.BMAX+1);// bit offsets, then code stack + var xp; // pointer into x or c + var y; // number of dummy codes added + var z; // number of entries in current table + var o; + var tail; // (zip_HuftList) + + tail = this.root = null; + for(i = 0; i < c.length; i++) + c[i] = 0; + for(i = 0; i < lx.length; i++) + lx[i] = 0; + for(i = 0; i < u.length; i++) + u[i] = null; + for(i = 0; i < v.length; i++) + v[i] = 0; + for(i = 0; i < x.length; i++) + x[i] = 0; + + // Generate counts for each bit length + el = n > 256 ? b[256] : this.BMAX; // set length of EOB code, if any + p = b; pidx = 0; + i = n; + do { + c[p[pidx]]++; // assume all entries <= BMAX + pidx++; + } while(--i > 0); + if(c[0] == n) { // null input--all zero length codes + this.root = null; + this.m = 0; + this.status = 0; + return; + } + + // Find minimum and maximum length, bound *m by those + for(j = 1; j <= this.BMAX; j++) + if(c[j] != 0) + break; + k = j; // minimum code length + if(mm < j) + mm = j; + for(i = this.BMAX; i != 0; i--) + if(c[i] != 0) + break; + g = i; // maximum code length + if(mm > i) + mm = i; + + // Adjust last length count to fill out codes, if needed + for(y = 1 << j; j < i; j++, y <<= 1) + if((y -= c[j]) < 0) { + this.status = 2; // bad input: more codes than bits + this.m = mm; + return; + } + if((y -= c[i]) < 0) { + this.status = 2; + this.m = mm; + return; + } + c[i] += y; + + // Generate starting offsets into the value table for each length + x[1] = j = 0; + p = c; + pidx = 1; + xp = 2; + while(--i > 0) // note that i == g from above + x[xp++] = (j += p[pidx++]); + + // Make a table of values in order of bit lengths + p = b; pidx = 0; + i = 0; + do { + if((j = p[pidx++]) != 0) + v[x[j]++] = i; + } while(++i < n); + n = x[g]; // set n to length of v + + // Generate the Huffman codes and for each, make the table entries + x[0] = i = 0; // first Huffman code is zero + p = v; pidx = 0; // grab values in bit order + h = -1; // no tables yet--level -1 + w = lx[0] = 0; // no bits decoded yet + q = null; // ditto + z = 0; // ditto + + // go through the bit lengths (k already is bits in shortest code) + for(; k <= g; k++) { + a = c[k]; + while(a-- > 0) { + // here i is the Huffman code of length k bits for value p[pidx] + // make tables up to required level + while(k > w + lx[1 + h]) { + w += lx[1 + h]; // add bits already decoded + h++; + + // compute minimum size table less than or equal to *m bits + z = (z = g - w) > mm ? mm : z; // upper limit + if((f = 1 << (j = k - w)) > a + 1) { // try a k-w bit table + // too few codes for k-w bit table + f -= a + 1; // deduct codes from patterns left + xp = k; + while(++j < z) { // try smaller tables up to z bits + if((f <<= 1) <= c[++xp]) + break; // enough codes to use up j bits + f -= c[xp]; // else deduct codes from patterns + } + } + if(w + j > el && w < el) + j = el - w; // make EOB code end at table + z = 1 << j; // table entries for j-bit table + lx[1 + h] = j; // set table size in stack + + // allocate and link in new table + q = new Array(z); + for(o = 0; o < z; o++) { + q[o] = new zip_HuftNode(); + } + + if(tail == null) + tail = this.root = new zip_HuftList(); + else + tail = tail.next = new zip_HuftList(); + tail.next = null; + tail.list = q; + u[h] = q; // table starts after link + + /* connect to last table, if there is one */ + if(h > 0) { + x[h] = i; // save pattern for backing up + r.b = lx[h]; // bits to dump before this table + r.e = 16 + j; // bits in this table + r.t = q; // pointer to this table + j = (i & ((1 << w) - 1)) >> (w - lx[h]); + u[h-1][j].e = r.e; + u[h-1][j].b = r.b; + u[h-1][j].n = r.n; + u[h-1][j].t = r.t; + } + } + + // set up table entry in r + r.b = k - w; + if(pidx >= n) + r.e = 99; // out of values--invalid code + else if(p[pidx] < s) { + r.e = (p[pidx] < 256 ? 16 : 15); // 256 is end-of-block code + r.n = p[pidx++]; // simple code is just the value + } else { + r.e = e[p[pidx] - s]; // non-simple--look up in lists + r.n = d[p[pidx++] - s]; + } + + // fill code-like entries with r // + f = 1 << (k - w); + for(j = i >> w; j < z; j += f) { + q[j].e = r.e; + q[j].b = r.b; + q[j].n = r.n; + q[j].t = r.t; + } + + // backwards increment the k-bit code i + for(j = 1 << (k - 1); (i & j) != 0; j >>= 1) + i ^= j; + i ^= j; + + // backup over finished tables + while((i & ((1 << w) - 1)) != x[h]) { + w -= lx[h]; // don't need to update q + h--; + } + } + } + + /* return actual size of base table */ + this.m = lx[1]; + + /* Return true (1) if we were given an incomplete table */ + this.status = ((y != 0 && g != 1) ? 1 : 0); + } /* end of constructor */ +} + + +/* routines (inflate) */ + +var zip_GET_BYTE = function() { + if(zip_inflate_data.length == zip_inflate_pos) + return -1; + return zip_inflate_data.charCodeAt(zip_inflate_pos++) & 0xff; +} + +var zip_NEEDBITS = function(n) { + while(zip_bit_len < n) { + zip_bit_buf |= zip_GET_BYTE() << zip_bit_len; + zip_bit_len += 8; + } +} + +var zip_GETBITS = function(n) { + return zip_bit_buf & zip_MASK_BITS[n]; +} + +var zip_DUMPBITS = function(n) { + zip_bit_buf >>= n; + zip_bit_len -= n; +} + +var zip_inflate_codes = function(buff, off, size) { + /* inflate (decompress) the codes in a deflated (compressed) block. + Return an error code or zero if it all goes ok. */ + var e; // table entry flag/number of extra bits + var t; // (zip_HuftNode) pointer to table entry + var n; + + if(size == 0) + return 0; + + // inflate the coded data + n = 0; + for(;;) { // do until end of block + zip_NEEDBITS(zip_bl); + t = zip_tl.list[zip_GETBITS(zip_bl)]; + e = t.e; + while(e > 16) { + if(e == 99) + return -1; + zip_DUMPBITS(t.b); + e -= 16; + zip_NEEDBITS(e); + t = t.t[zip_GETBITS(e)]; + e = t.e; + } + zip_DUMPBITS(t.b); + + if(e == 16) { // then it's a literal + zip_wp &= zip_WSIZE - 1; + buff[off + n++] = zip_slide[zip_wp++] = t.n; + if(n == size) + return size; + continue; + } + + // exit if end of block + if(e == 15) + break; + + // it's an EOB or a length + + // get length of block to copy + zip_NEEDBITS(e); + zip_copy_leng = t.n + zip_GETBITS(e); + zip_DUMPBITS(e); + + // decode distance of block to copy + zip_NEEDBITS(zip_bd); + t = zip_td.list[zip_GETBITS(zip_bd)]; + e = t.e; + + while(e > 16) { + if(e == 99) + return -1; + zip_DUMPBITS(t.b); + e -= 16; + zip_NEEDBITS(e); + t = t.t[zip_GETBITS(e)]; + e = t.e; + } + zip_DUMPBITS(t.b); + zip_NEEDBITS(e); + zip_copy_dist = zip_wp - t.n - zip_GETBITS(e); + zip_DUMPBITS(e); + + // do the copy + while(zip_copy_leng > 0 && n < size) { + zip_copy_leng--; + zip_copy_dist &= zip_WSIZE - 1; + zip_wp &= zip_WSIZE - 1; + buff[off + n++] = zip_slide[zip_wp++] + = zip_slide[zip_copy_dist++]; + } + + if(n == size) + return size; + } + + zip_method = -1; // done + return n; +} + +var zip_inflate_stored = function(buff, off, size) { + /* "decompress" an inflated type 0 (stored) block. */ + var n; + + // go to byte boundary + n = zip_bit_len & 7; + zip_DUMPBITS(n); + + // get the length and its complement + zip_NEEDBITS(16); + n = zip_GETBITS(16); + zip_DUMPBITS(16); + zip_NEEDBITS(16); + if(n != ((~zip_bit_buf) & 0xffff)) + return -1; // error in compressed data + zip_DUMPBITS(16); + + // read and output the compressed data + zip_copy_leng = n; + + n = 0; + while(zip_copy_leng > 0 && n < size) { + zip_copy_leng--; + zip_wp &= zip_WSIZE - 1; + zip_NEEDBITS(8); + buff[off + n++] = zip_slide[zip_wp++] = + zip_GETBITS(8); + zip_DUMPBITS(8); + } + + if(zip_copy_leng == 0) + zip_method = -1; // done + return n; +} + +var zip_inflate_fixed = function(buff, off, size) { + /* decompress an inflated type 1 (fixed Huffman codes) block. We should + either replace this with a custom decoder, or at least precompute the + Huffman tables. */ + + // if first time, set up tables for fixed blocks + if(zip_fixed_tl == null) { + var i; // temporary variable + var l = new Array(288); // length list for huft_build + var h; // zip_HuftBuild + + // literal table + for(i = 0; i < 144; i++) + l[i] = 8; + for(; i < 256; i++) + l[i] = 9; + for(; i < 280; i++) + l[i] = 7; + for(; i < 288; i++) // make a complete, but wrong code set + l[i] = 8; + zip_fixed_bl = 7; + + h = new zip_HuftBuild(l, 288, 257, zip_cplens, zip_cplext, + zip_fixed_bl); + if(h.status != 0) { + alert("HufBuild error: "+h.status); + return -1; + } + zip_fixed_tl = h.root; + zip_fixed_bl = h.m; + + // distance table + for(i = 0; i < 30; i++) // make an incomplete code set + l[i] = 5; + zip_fixed_bd = 5; + + h = new zip_HuftBuild(l, 30, 0, zip_cpdist, zip_cpdext, zip_fixed_bd); + if(h.status > 1) { + zip_fixed_tl = null; + alert("HufBuild error: "+h.status); + return -1; + } + zip_fixed_td = h.root; + zip_fixed_bd = h.m; + } + + zip_tl = zip_fixed_tl; + zip_td = zip_fixed_td; + zip_bl = zip_fixed_bl; + zip_bd = zip_fixed_bd; + return zip_inflate_codes(buff, off, size); +} + +var zip_inflate_dynamic = function(buff, off, size) { + // decompress an inflated type 2 (dynamic Huffman codes) block. + var i; // temporary variables + var j; + var l; // last length + var n; // number of lengths to get + var t; // (zip_HuftNode) literal/length code table + var nb; // number of bit length codes + var nl; // number of literal/length codes + var nd; // number of distance codes + var ll = new Array(286+30); // literal/length and distance code lengths + var h; // (zip_HuftBuild) + + for(i = 0; i < ll.length; i++) + ll[i] = 0; + + // read in table lengths + zip_NEEDBITS(5); + nl = 257 + zip_GETBITS(5); // number of literal/length codes + zip_DUMPBITS(5); + zip_NEEDBITS(5); + nd = 1 + zip_GETBITS(5); // number of distance codes + zip_DUMPBITS(5); + zip_NEEDBITS(4); + nb = 4 + zip_GETBITS(4); // number of bit length codes + zip_DUMPBITS(4); + if(nl > 286 || nd > 30) + return -1; // bad lengths + + // read in bit-length-code lengths + for(j = 0; j < nb; j++) + { + zip_NEEDBITS(3); + ll[zip_border[j]] = zip_GETBITS(3); + zip_DUMPBITS(3); + } + for(; j < 19; j++) + ll[zip_border[j]] = 0; + + // build decoding table for trees--single level, 7 bit lookup + zip_bl = 7; + h = new zip_HuftBuild(ll, 19, 19, null, null, zip_bl); + if(h.status != 0) + return -1; // incomplete code set + + zip_tl = h.root; + zip_bl = h.m; + + // read in literal and distance code lengths + n = nl + nd; + i = l = 0; + while(i < n) { + zip_NEEDBITS(zip_bl); + t = zip_tl.list[zip_GETBITS(zip_bl)]; + j = t.b; + zip_DUMPBITS(j); + j = t.n; + if(j < 16) // length of code in bits (0..15) + ll[i++] = l = j; // save last length in l + else if(j == 16) { // repeat last length 3 to 6 times + zip_NEEDBITS(2); + j = 3 + zip_GETBITS(2); + zip_DUMPBITS(2); + if(i + j > n) + return -1; + while(j-- > 0) + ll[i++] = l; + } else if(j == 17) { // 3 to 10 zero length codes + zip_NEEDBITS(3); + j = 3 + zip_GETBITS(3); + zip_DUMPBITS(3); + if(i + j > n) + return -1; + while(j-- > 0) + ll[i++] = 0; + l = 0; + } else { // j == 18: 11 to 138 zero length codes + zip_NEEDBITS(7); + j = 11 + zip_GETBITS(7); + zip_DUMPBITS(7); + if(i + j > n) + return -1; + while(j-- > 0) + ll[i++] = 0; + l = 0; + } + } + + // build the decoding tables for literal/length and distance codes + zip_bl = zip_lbits; + h = new zip_HuftBuild(ll, nl, 257, zip_cplens, zip_cplext, zip_bl); + if(zip_bl == 0) // no literals or lengths + h.status = 1; + if(h.status != 0) { + if(h.status == 1) + ;// **incomplete literal tree** + return -1; // incomplete code set + } + zip_tl = h.root; + zip_bl = h.m; + + for(i = 0; i < nd; i++) + ll[i] = ll[i + nl]; + zip_bd = zip_dbits; + h = new zip_HuftBuild(ll, nd, 0, zip_cpdist, zip_cpdext, zip_bd); + zip_td = h.root; + zip_bd = h.m; + + if(zip_bd == 0 && nl > 257) { // lengths but no distances + // **incomplete distance tree** + return -1; + } + + if(h.status == 1) { + ;// **incomplete distance tree** + } + if(h.status != 0) + return -1; + + // decompress until an end-of-block code + return zip_inflate_codes(buff, off, size); +} + +var zip_inflate_start = function() { + var i; + + if(zip_slide == null) + zip_slide = new Array(2 * zip_WSIZE); + zip_wp = 0; + zip_bit_buf = 0; + zip_bit_len = 0; + zip_method = -1; + zip_eof = false; + zip_copy_leng = zip_copy_dist = 0; + zip_tl = null; +} + +var zip_inflate_internal = function(buff, off, size) { + // decompress an inflated entry + var n, i; + + n = 0; + while(n < size) { + if(zip_eof && zip_method == -1) + return n; + + if(zip_copy_leng > 0) { + if(zip_method != zip_STORED_BLOCK) { + // STATIC_TREES or DYN_TREES + while(zip_copy_leng > 0 && n < size) { + zip_copy_leng--; + zip_copy_dist &= zip_WSIZE - 1; + zip_wp &= zip_WSIZE - 1; + buff[off + n++] = zip_slide[zip_wp++] = + zip_slide[zip_copy_dist++]; + } + } else { + while(zip_copy_leng > 0 && n < size) { + zip_copy_leng--; + zip_wp &= zip_WSIZE - 1; + zip_NEEDBITS(8); + buff[off + n++] = zip_slide[zip_wp++] = zip_GETBITS(8); + zip_DUMPBITS(8); + } + if(zip_copy_leng == 0) + zip_method = -1; // done + } + if(n == size) + return n; + } + + if(zip_method == -1) { + if(zip_eof) + break; + + // read in last block bit + zip_NEEDBITS(1); + if(zip_GETBITS(1) != 0) + zip_eof = true; + zip_DUMPBITS(1); + + // read in block type + zip_NEEDBITS(2); + zip_method = zip_GETBITS(2); + zip_DUMPBITS(2); + zip_tl = null; + zip_copy_leng = 0; + } + + switch(zip_method) { + case 0: // zip_STORED_BLOCK + i = zip_inflate_stored(buff, off + n, size - n); + break; + + case 1: // zip_STATIC_TREES + if(zip_tl != null) + i = zip_inflate_codes(buff, off + n, size - n); + else + i = zip_inflate_fixed(buff, off + n, size - n); + break; + + case 2: // zip_DYN_TREES + if(zip_tl != null) + i = zip_inflate_codes(buff, off + n, size - n); + else + i = zip_inflate_dynamic(buff, off + n, size - n); + break; + + default: // error + i = -1; + break; + } + + if(i == -1) { + if(zip_eof) + return 0; + return -1; + } + n += i; + } + return n; +} + +var zip_inflate = function(str) { + var i, j; + + zip_inflate_start(); + zip_inflate_data = str; + zip_inflate_pos = 0; + + var buff = new Array(1024); + var aout = []; + while((i = zip_inflate_internal(buff, 0, buff.length)) > 0) { + var cbuf = new Array(i); + for(j = 0; j < i; j++){ + cbuf[j] = String.fromCharCode(buff[j]); + } + aout[aout.length] = cbuf.join(""); + } + zip_inflate_data = null; // G.C. + return aout.join(""); +} + +if (! ctx.RawDeflate) ctx.RawDeflate = {}; +ctx.RawDeflate.inflate = zip_inflate; + +})(this); diff --git a/js/showdown-1.9.1.js b/js/showdown-1.9.1.js new file mode 100644 index 00000000..11c4c6ad --- /dev/null +++ b/js/showdown-1.9.1.js @@ -0,0 +1,2 @@ +/*! showdown v 1.9.1 - 02-11-2019 */ +(function(){function e(e){"use strict";var r={omitExtraWLInCodeBlocks:{defaultValue:!1,describe:"Omit the default extra whiteline added to code blocks",type:"boolean"},noHeaderId:{defaultValue:!1,describe:"Turn on/off generated header id",type:"boolean"},prefixHeaderId:{defaultValue:!1,describe:"Add a prefix to the generated header ids. Passing a string will prefix that string to the header id. Setting to true will add a generic 'section-' prefix",type:"string"},rawPrefixHeaderId:{defaultValue:!1,describe:'Setting this option to true will prevent showdown from modifying the prefix. This might result in malformed IDs (if, for instance, the " char is used in the prefix)',type:"boolean"},ghCompatibleHeaderId:{defaultValue:!1,describe:"Generate header ids compatible with github style (spaces are replaced with dashes, a bunch of non alphanumeric chars are removed)",type:"boolean"},rawHeaderId:{defaultValue:!1,describe:"Remove only spaces, ' and \" from generated header ids (including prefixes), replacing them with dashes (-). WARNING: This might result in malformed ids",type:"boolean"},headerLevelStart:{defaultValue:!1,describe:"The header blocks level start",type:"integer"},parseImgDimensions:{defaultValue:!1,describe:"Turn on/off image dimension parsing",type:"boolean"},simplifiedAutoLink:{defaultValue:!1,describe:"Turn on/off GFM autolink style",type:"boolean"},excludeTrailingPunctuationFromURLs:{defaultValue:!1,describe:"Excludes trailing punctuation from links generated with autoLinking",type:"boolean"},literalMidWordUnderscores:{defaultValue:!1,describe:"Parse midword underscores as literal underscores",type:"boolean"},literalMidWordAsterisks:{defaultValue:!1,describe:"Parse midword asterisks as literal asterisks",type:"boolean"},strikethrough:{defaultValue:!1,describe:"Turn on/off strikethrough support",type:"boolean"},tables:{defaultValue:!1,describe:"Turn on/off tables support",type:"boolean"},tablesHeaderId:{defaultValue:!1,describe:"Add an id to table headers",type:"boolean"},ghCodeBlocks:{defaultValue:!0,describe:"Turn on/off GFM fenced code blocks support",type:"boolean"},tasklists:{defaultValue:!1,describe:"Turn on/off GFM tasklist support",type:"boolean"},smoothLivePreview:{defaultValue:!1,describe:"Prevents weird effects in live previews due to incomplete input",type:"boolean"},smartIndentationFix:{defaultValue:!1,description:"Tries to smartly fix indentation in es6 strings",type:"boolean"},disableForced4SpacesIndentedSublists:{defaultValue:!1,description:"Disables the requirement of indenting nested sublists by 4 spaces",type:"boolean"},simpleLineBreaks:{defaultValue:!1,description:"Parses simple line breaks as <br> (GFM Style)",type:"boolean"},requireSpaceBeforeHeadingText:{defaultValue:!1,description:"Makes adding a space between `#` and the header text mandatory (GFM Style)",type:"boolean"},ghMentions:{defaultValue:!1,description:"Enables github @mentions",type:"boolean"},ghMentionsLink:{defaultValue:"https://github.com/{u}",description:"Changes the link generated by @mentions. Only applies if ghMentions option is enabled.",type:"string"},encodeEmails:{defaultValue:!0,description:"Encode e-mail addresses through the use of Character Entities, transforming ASCII e-mail addresses into its equivalent decimal entities",type:"boolean"},openLinksInNewWindow:{defaultValue:!1,description:"Open all links in new windows",type:"boolean"},backslashEscapesHTMLTags:{defaultValue:!1,description:"Support for HTML Tag escaping. ex: <div>foo</div>",type:"boolean"},emoji:{defaultValue:!1,description:"Enable emoji support. Ex: `this is a :smile: emoji`",type:"boolean"},underline:{defaultValue:!1,description:"Enable support for underline. Syntax is double or triple underscores: `__underline word__`. With this option enabled, underscores no longer parses into `<em>` and `<strong>`",type:"boolean"},completeHTMLDocument:{defaultValue:!1,description:"Outputs a complete html document, including `<html>`, `<head>` and `<body>` tags",type:"boolean"},metadata:{defaultValue:!1,description:"Enable support for document metadata (defined at the top of the document between `«««` and `»»»` or between `---` and `---`).",type:"boolean"},splitAdjacentBlockquotes:{defaultValue:!1,description:"Split adjacent blockquote blocks",type:"boolean"}};if(!1===e)return JSON.parse(JSON.stringify(r));var t={};for(var a in r)r.hasOwnProperty(a)&&(t[a]=r[a].defaultValue);return t}function r(e,r){"use strict";var t=r?"Error in "+r+" extension->":"Error in unnamed extension",n={valid:!0,error:""};a.helper.isArray(e)||(e=[e]);for(var s=0;s<e.length;++s){var o=t+" sub-extension "+s+": ",i=e[s];if("object"!=typeof i)return n.valid=!1,n.error=o+"must be an object, but "+typeof i+" given",n;if(!a.helper.isString(i.type))return n.valid=!1,n.error=o+'property "type" must be a string, but '+typeof i.type+" given",n;var l=i.type=i.type.toLowerCase();if("language"===l&&(l=i.type="lang"),"html"===l&&(l=i.type="output"),"lang"!==l&&"output"!==l&&"listener"!==l)return n.valid=!1,n.error=o+"type "+l+' is not recognized. Valid values: "lang/language", "output/html" or "listener"',n;if("listener"===l){if(a.helper.isUndefined(i.listeners))return n.valid=!1,n.error=o+'. Extensions of type "listener" must have a property called "listeners"',n}else if(a.helper.isUndefined(i.filter)&&a.helper.isUndefined(i.regex))return n.valid=!1,n.error=o+l+' extensions must define either a "regex" property or a "filter" method',n;if(i.listeners){if("object"!=typeof i.listeners)return n.valid=!1,n.error=o+'"listeners" property must be an object but '+typeof i.listeners+" given",n;for(var c in i.listeners)if(i.listeners.hasOwnProperty(c)&&"function"!=typeof i.listeners[c])return n.valid=!1,n.error=o+'"listeners" property must be an hash of [event name]: [callback]. listeners.'+c+" must be a function but "+typeof i.listeners[c]+" given",n}if(i.filter){if("function"!=typeof i.filter)return n.valid=!1,n.error=o+'"filter" must be a function, but '+typeof i.filter+" given",n}else if(i.regex){if(a.helper.isString(i.regex)&&(i.regex=new RegExp(i.regex,"g")),!(i.regex instanceof RegExp))return n.valid=!1,n.error=o+'"regex" property must either be a string or a RegExp object, but '+typeof i.regex+" given",n;if(a.helper.isUndefined(i.replace))return n.valid=!1,n.error=o+'"regex" extensions must implement a replace string or function',n}}return n}function t(e,r){"use strict";return"¨E"+r.charCodeAt(0)+"E"}var a={},n={},s={},o=e(!0),i="vanilla",l={github:{omitExtraWLInCodeBlocks:!0,simplifiedAutoLink:!0,excludeTrailingPunctuationFromURLs:!0,literalMidWordUnderscores:!0,strikethrough:!0,tables:!0,tablesHeaderId:!0,ghCodeBlocks:!0,tasklists:!0,disableForced4SpacesIndentedSublists:!0,simpleLineBreaks:!0,requireSpaceBeforeHeadingText:!0,ghCompatibleHeaderId:!0,ghMentions:!0,backslashEscapesHTMLTags:!0,emoji:!0,splitAdjacentBlockquotes:!0},original:{noHeaderId:!0,ghCodeBlocks:!1},ghost:{omitExtraWLInCodeBlocks:!0,parseImgDimensions:!0,simplifiedAutoLink:!0,excludeTrailingPunctuationFromURLs:!0,literalMidWordUnderscores:!0,strikethrough:!0,tables:!0,tablesHeaderId:!0,ghCodeBlocks:!0,tasklists:!0,smoothLivePreview:!0,simpleLineBreaks:!0,requireSpaceBeforeHeadingText:!0,ghMentions:!1,encodeEmails:!0},vanilla:e(!0),allOn:function(){"use strict";var r=e(!0),t={};for(var a in r)r.hasOwnProperty(a)&&(t[a]=!0);return t}()};a.helper={},a.extensions={},a.setOption=function(e,r){"use strict";return o[e]=r,this},a.getOption=function(e){"use strict";return o[e]},a.getOptions=function(){"use strict";return o},a.resetOptions=function(){"use strict";o=e(!0)},a.setFlavor=function(e){"use strict";if(!l.hasOwnProperty(e))throw Error(e+" flavor was not found");a.resetOptions();var r=l[e];i=e;for(var t in r)r.hasOwnProperty(t)&&(o[t]=r[t])},a.getFlavor=function(){"use strict";return i},a.getFlavorOptions=function(e){"use strict";if(l.hasOwnProperty(e))return l[e]},a.getDefaultOptions=function(r){"use strict";return e(r)},a.subParser=function(e,r){"use strict";if(a.helper.isString(e)){if(void 0===r){if(n.hasOwnProperty(e))return n[e];throw Error("SubParser named "+e+" not registered!")}n[e]=r}},a.extension=function(e,t){"use strict";if(!a.helper.isString(e))throw Error("Extension 'name' must be a string");if(e=a.helper.stdExtName(e),a.helper.isUndefined(t)){if(!s.hasOwnProperty(e))throw Error("Extension named "+e+" is not registered!");return s[e]}"function"==typeof t&&(t=t()),a.helper.isArray(t)||(t=[t]);var n=r(t,e);if(!n.valid)throw Error(n.error);s[e]=t},a.getAllExtensions=function(){"use strict";return s},a.removeExtension=function(e){"use strict";delete s[e]},a.resetExtensions=function(){"use strict";s={}},a.validateExtension=function(e){"use strict";var t=r(e,null);return!!t.valid||(console.warn(t.error),!1)},a.hasOwnProperty("helper")||(a.helper={}),a.helper.isString=function(e){"use strict";return"string"==typeof e||e instanceof String},a.helper.isFunction=function(e){"use strict";return e&&"[object Function]"==={}.toString.call(e)},a.helper.isArray=function(e){"use strict";return Array.isArray(e)},a.helper.isUndefined=function(e){"use strict";return void 0===e},a.helper.forEach=function(e,r){"use strict";if(a.helper.isUndefined(e))throw new Error("obj param is required");if(a.helper.isUndefined(r))throw new Error("callback param is required");if(!a.helper.isFunction(r))throw new Error("callback param must be a function/closure");if("function"==typeof e.forEach)e.forEach(r);else if(a.helper.isArray(e))for(var t=0;t<e.length;t++)r(e[t],t,e);else{if("object"!=typeof e)throw new Error("obj does not seem to be an array or an iterable object");for(var n in e)e.hasOwnProperty(n)&&r(e[n],n,e)}},a.helper.stdExtName=function(e){"use strict";return e.replace(/[_?*+\/\\.^-]/g,"").replace(/\s/g,"").toLowerCase()},a.helper.escapeCharactersCallback=t,a.helper.escapeCharacters=function(e,r,a){"use strict";var n="(["+r.replace(/([\[\]\\])/g,"\\$1")+"])";a&&(n="\\\\"+n);var s=new RegExp(n,"g");return e=e.replace(s,t)},a.helper.unescapeHTMLEntities=function(e){"use strict";return e.replace(/"/g,'"').replace(/</g,"<").replace(/>/g,">").replace(/&/g,"&")};var c=function(e,r,t,a){"use strict";var n,s,o,i,l,c=a||"",u=c.indexOf("g")>-1,d=new RegExp(r+"|"+t,"g"+c.replace(/g/g,"")),p=new RegExp(r,c.replace(/g/g,"")),h=[];do{for(n=0;o=d.exec(e);)if(p.test(o[0]))n++||(i=(s=d.lastIndex)-o[0].length);else if(n&&!--n){l=o.index+o[0].length;var _={left:{start:i,end:s},match:{start:s,end:o.index},right:{start:o.index,end:l},wholeMatch:{start:i,end:l}};if(h.push(_),!u)return h}}while(n&&(d.lastIndex=s));return h};a.helper.matchRecursiveRegExp=function(e,r,t,a){"use strict";for(var n=c(e,r,t,a),s=[],o=0;o<n.length;++o)s.push([e.slice(n[o].wholeMatch.start,n[o].wholeMatch.end),e.slice(n[o].match.start,n[o].match.end),e.slice(n[o].left.start,n[o].left.end),e.slice(n[o].right.start,n[o].right.end)]);return s},a.helper.replaceRecursiveRegExp=function(e,r,t,n,s){"use strict";if(!a.helper.isFunction(r)){var o=r;r=function(){return o}}var i=c(e,t,n,s),l=e,u=i.length;if(u>0){var d=[];0!==i[0].wholeMatch.start&&d.push(e.slice(0,i[0].wholeMatch.start));for(var p=0;p<u;++p)d.push(r(e.slice(i[p].wholeMatch.start,i[p].wholeMatch.end),e.slice(i[p].match.start,i[p].match.end),e.slice(i[p].left.start,i[p].left.end),e.slice(i[p].right.start,i[p].right.end))),p<u-1&&d.push(e.slice(i[p].wholeMatch.end,i[p+1].wholeMatch.start));i[u-1].wholeMatch.end<e.length&&d.push(e.slice(i[u-1].wholeMatch.end)),l=d.join("")}return l},a.helper.regexIndexOf=function(e,r,t){"use strict";if(!a.helper.isString(e))throw"InvalidArgumentError: first parameter of showdown.helper.regexIndexOf function must be a string";if(r instanceof RegExp==!1)throw"InvalidArgumentError: second parameter of showdown.helper.regexIndexOf function must be an instance of RegExp";var n=e.substring(t||0).search(r);return n>=0?n+(t||0):n},a.helper.splitAtIndex=function(e,r){"use strict";if(!a.helper.isString(e))throw"InvalidArgumentError: first parameter of showdown.helper.regexIndexOf function must be a string";return[e.substring(0,r),e.substring(r)]},a.helper.encodeEmailAddress=function(e){"use strict";var r=[function(e){return"&#"+e.charCodeAt(0)+";"},function(e){return"&#x"+e.charCodeAt(0).toString(16)+";"},function(e){return e}];return e=e.replace(/./g,function(e){if("@"===e)e=r[Math.floor(2*Math.random())](e);else{var t=Math.random();e=t>.9?r[2](e):t>.45?r[1](e):r[0](e)}return e})},a.helper.padEnd=function(e,r,t){"use strict";return r>>=0,t=String(t||" "),e.length>r?String(e):((r-=e.length)>t.length&&(t+=t.repeat(r/t.length)),String(e)+t.slice(0,r))},"undefined"==typeof console&&(console={warn:function(e){"use strict";alert(e)},log:function(e){"use strict";alert(e)},error:function(e){"use strict";throw e}}),a.helper.regexes={asteriskDashAndColon:/([*_:~])/g},a.helper.emojis={"+1":"👍","-1":"👎",100:"💯",1234:"🔢","1st_place_medal":"🥇","2nd_place_medal":"🥈","3rd_place_medal":"🥉","8ball":"🎱",a:"🅰️",ab:"🆎",abc:"🔤",abcd:"🔡",accept:"🉑",aerial_tramway:"🚡",airplane:"✈️",alarm_clock:"⏰",alembic:"⚗️",alien:"👽",ambulance:"🚑",amphora:"🏺",anchor:"⚓️",angel:"👼",anger:"💢",angry:"😠",anguished:"😧",ant:"🐜",apple:"🍎",aquarius:"♒️",aries:"♈️",arrow_backward:"◀️",arrow_double_down:"⏬",arrow_double_up:"⏫",arrow_down:"⬇️",arrow_down_small:"🔽",arrow_forward:"▶️",arrow_heading_down:"⤵️",arrow_heading_up:"⤴️",arrow_left:"⬅️",arrow_lower_left:"↙️",arrow_lower_right:"↘️",arrow_right:"➡️",arrow_right_hook:"↪️",arrow_up:"⬆️",arrow_up_down:"↕️",arrow_up_small:"🔼",arrow_upper_left:"↖️",arrow_upper_right:"↗️",arrows_clockwise:"🔃",arrows_counterclockwise:"🔄",art:"🎨",articulated_lorry:"🚛",artificial_satellite:"🛰",astonished:"😲",athletic_shoe:"👟",atm:"🏧",atom_symbol:"⚛️",avocado:"🥑",b:"🅱️",baby:"👶",baby_bottle:"🍼",baby_chick:"🐤",baby_symbol:"🚼",back:"🔙",bacon:"🥓",badminton:"🏸",baggage_claim:"🛄",baguette_bread:"🥖",balance_scale:"⚖️",balloon:"🎈",ballot_box:"🗳",ballot_box_with_check:"☑️",bamboo:"🎍",banana:"🍌",bangbang:"‼️",bank:"🏦",bar_chart:"📊",barber:"💈",baseball:"⚾️",basketball:"🏀",basketball_man:"⛹️",basketball_woman:"⛹️‍♀️",bat:"🦇",bath:"🛀",bathtub:"🛁",battery:"🔋",beach_umbrella:"🏖",bear:"🐻",bed:"🛏",bee:"🐝",beer:"🍺",beers:"🍻",beetle:"🐞",beginner:"🔰",bell:"🔔",bellhop_bell:"🛎",bento:"🍱",biking_man:"🚴",bike:"🚲",biking_woman:"🚴‍♀️",bikini:"👙",biohazard:"☣️",bird:"🐦",birthday:"🎂",black_circle:"⚫️",black_flag:"🏴",black_heart:"🖤",black_joker:"🃏",black_large_square:"⬛️",black_medium_small_square:"◾️",black_medium_square:"◼️",black_nib:"✒️",black_small_square:"▪️",black_square_button:"🔲",blonde_man:"👱",blonde_woman:"👱‍♀️",blossom:"🌼",blowfish:"🐡",blue_book:"📘",blue_car:"🚙",blue_heart:"💙",blush:"😊",boar:"🐗",boat:"⛵️",bomb:"💣",book:"📖",bookmark:"🔖",bookmark_tabs:"📑",books:"📚",boom:"💥",boot:"👢",bouquet:"💐",bowing_man:"🙇",bow_and_arrow:"🏹",bowing_woman:"🙇‍♀️",bowling:"🎳",boxing_glove:"🥊",boy:"👦",bread:"🍞",bride_with_veil:"👰",bridge_at_night:"🌉",briefcase:"💼",broken_heart:"💔",bug:"🐛",building_construction:"🏗",bulb:"💡",bullettrain_front:"🚅",bullettrain_side:"🚄",burrito:"🌯",bus:"🚌",business_suit_levitating:"🕴",busstop:"🚏",bust_in_silhouette:"👤",busts_in_silhouette:"👥",butterfly:"🦋",cactus:"🌵",cake:"🍰",calendar:"📆",call_me_hand:"🤙",calling:"📲",camel:"🐫",camera:"📷",camera_flash:"📸",camping:"🏕",cancer:"♋️",candle:"🕯",candy:"🍬",canoe:"🛶",capital_abcd:"🔠",capricorn:"♑️",car:"🚗",card_file_box:"🗃",card_index:"📇",card_index_dividers:"🗂",carousel_horse:"🎠",carrot:"🥕",cat:"🐱",cat2:"🐈",cd:"💿",chains:"⛓",champagne:"🍾",chart:"💹",chart_with_downwards_trend:"📉",chart_with_upwards_trend:"📈",checkered_flag:"🏁",cheese:"🧀",cherries:"🍒",cherry_blossom:"🌸",chestnut:"🌰",chicken:"🐔",children_crossing:"🚸",chipmunk:"🐿",chocolate_bar:"🍫",christmas_tree:"🎄",church:"⛪️",cinema:"🎦",circus_tent:"🎪",city_sunrise:"🌇",city_sunset:"🌆",cityscape:"🏙",cl:"🆑",clamp:"🗜",clap:"👏",clapper:"🎬",classical_building:"🏛",clinking_glasses:"🥂",clipboard:"📋",clock1:"🕐",clock10:"🕙",clock1030:"🕥",clock11:"🕚",clock1130:"🕦",clock12:"🕛",clock1230:"🕧",clock130:"🕜",clock2:"🕑",clock230:"🕝",clock3:"🕒",clock330:"🕞",clock4:"🕓",clock430:"🕟",clock5:"🕔",clock530:"🕠",clock6:"🕕",clock630:"🕡",clock7:"🕖",clock730:"🕢",clock8:"🕗",clock830:"🕣",clock9:"🕘",clock930:"🕤",closed_book:"📕",closed_lock_with_key:"🔐",closed_umbrella:"🌂",cloud:"☁️",cloud_with_lightning:"🌩",cloud_with_lightning_and_rain:"⛈",cloud_with_rain:"🌧",cloud_with_snow:"🌨",clown_face:"🤡",clubs:"♣️",cocktail:"🍸",coffee:"☕️",coffin:"⚰️",cold_sweat:"😰",comet:"☄️",computer:"💻",computer_mouse:"🖱",confetti_ball:"🎊",confounded:"😖",confused:"😕",congratulations:"㊗️",construction:"🚧",construction_worker_man:"👷",construction_worker_woman:"👷‍♀️",control_knobs:"🎛",convenience_store:"🏪",cookie:"🍪",cool:"🆒",policeman:"👮",copyright:"©️",corn:"🌽",couch_and_lamp:"🛋",couple:"👫",couple_with_heart_woman_man:"💑",couple_with_heart_man_man:"👨‍❤️‍👨",couple_with_heart_woman_woman:"👩‍❤️‍👩",couplekiss_man_man:"👨‍❤️‍💋‍👨",couplekiss_man_woman:"💏",couplekiss_woman_woman:"👩‍❤️‍💋‍👩",cow:"🐮",cow2:"🐄",cowboy_hat_face:"🤠",crab:"🦀",crayon:"🖍",credit_card:"💳",crescent_moon:"🌙",cricket:"🏏",crocodile:"🐊",croissant:"🥐",crossed_fingers:"🤞",crossed_flags:"🎌",crossed_swords:"⚔️",crown:"👑",cry:"😢",crying_cat_face:"😿",crystal_ball:"🔮",cucumber:"🥒",cupid:"💘",curly_loop:"➰",currency_exchange:"💱",curry:"🍛",custard:"🍮",customs:"🛃",cyclone:"🌀",dagger:"🗡",dancer:"💃",dancing_women:"👯",dancing_men:"👯‍♂️",dango:"🍡",dark_sunglasses:"🕶",dart:"🎯",dash:"💨",date:"📅",deciduous_tree:"🌳",deer:"🦌",department_store:"🏬",derelict_house:"🏚",desert:"🏜",desert_island:"🏝",desktop_computer:"🖥",male_detective:"🕵️",diamond_shape_with_a_dot_inside:"💠",diamonds:"♦️",disappointed:"😞",disappointed_relieved:"😥",dizzy:"💫",dizzy_face:"😵",do_not_litter:"🚯",dog:"🐶",dog2:"🐕",dollar:"💵",dolls:"🎎",dolphin:"🐬",door:"🚪",doughnut:"🍩",dove:"🕊",dragon:"🐉",dragon_face:"🐲",dress:"👗",dromedary_camel:"🐪",drooling_face:"🤤",droplet:"💧",drum:"🥁",duck:"🦆",dvd:"📀","e-mail":"📧",eagle:"🦅",ear:"👂",ear_of_rice:"🌾",earth_africa:"🌍",earth_americas:"🌎",earth_asia:"🌏",egg:"🥚",eggplant:"🍆",eight_pointed_black_star:"✴️",eight_spoked_asterisk:"✳️",electric_plug:"🔌",elephant:"🐘",email:"✉️",end:"🔚",envelope_with_arrow:"📩",euro:"💶",european_castle:"🏰",european_post_office:"🏤",evergreen_tree:"🌲",exclamation:"❗️",expressionless:"😑",eye:"👁",eye_speech_bubble:"👁‍🗨",eyeglasses:"👓",eyes:"👀",face_with_head_bandage:"🤕",face_with_thermometer:"🤒",fist_oncoming:"👊",factory:"🏭",fallen_leaf:"🍂",family_man_woman_boy:"👪",family_man_boy:"👨‍👦",family_man_boy_boy:"👨‍👦‍👦",family_man_girl:"👨‍👧",family_man_girl_boy:"👨‍👧‍👦",family_man_girl_girl:"👨‍👧‍👧",family_man_man_boy:"👨‍👨‍👦",family_man_man_boy_boy:"👨‍👨‍👦‍👦",family_man_man_girl:"👨‍👨‍👧",family_man_man_girl_boy:"👨‍👨‍👧‍👦",family_man_man_girl_girl:"👨‍👨‍👧‍👧",family_man_woman_boy_boy:"👨‍👩‍👦‍👦",family_man_woman_girl:"👨‍👩‍👧",family_man_woman_girl_boy:"👨‍👩‍👧‍👦",family_man_woman_girl_girl:"👨‍👩‍👧‍👧",family_woman_boy:"👩‍👦",family_woman_boy_boy:"👩‍👦‍👦",family_woman_girl:"👩‍👧",family_woman_girl_boy:"👩‍👧‍👦",family_woman_girl_girl:"👩‍👧‍👧",family_woman_woman_boy:"👩‍👩‍👦",family_woman_woman_boy_boy:"👩‍👩‍👦‍👦",family_woman_woman_girl:"👩‍👩‍👧",family_woman_woman_girl_boy:"👩‍👩‍👧‍👦",family_woman_woman_girl_girl:"👩‍👩‍👧‍👧",fast_forward:"⏩",fax:"📠",fearful:"😨",feet:"🐾",female_detective:"🕵️‍♀️",ferris_wheel:"🎡",ferry:"⛴",field_hockey:"🏑",file_cabinet:"🗄",file_folder:"📁",film_projector:"📽",film_strip:"🎞",fire:"🔥",fire_engine:"🚒",fireworks:"🎆",first_quarter_moon:"🌓",first_quarter_moon_with_face:"🌛",fish:"🐟",fish_cake:"🍥",fishing_pole_and_fish:"🎣",fist_raised:"✊",fist_left:"🤛",fist_right:"🤜",flags:"🎏",flashlight:"🔦",fleur_de_lis:"⚜️",flight_arrival:"🛬",flight_departure:"🛫",floppy_disk:"💾",flower_playing_cards:"🎴",flushed:"😳",fog:"🌫",foggy:"🌁",football:"🏈",footprints:"👣",fork_and_knife:"🍴",fountain:"⛲️",fountain_pen:"🖋",four_leaf_clover:"🍀",fox_face:"🦊",framed_picture:"🖼",free:"🆓",fried_egg:"🍳",fried_shrimp:"🍤",fries:"🍟",frog:"🐸",frowning:"😦",frowning_face:"☹️",frowning_man:"🙍‍♂️",frowning_woman:"🙍",middle_finger:"🖕",fuelpump:"⛽️",full_moon:"🌕",full_moon_with_face:"🌝",funeral_urn:"⚱️",game_die:"🎲",gear:"⚙️",gem:"💎",gemini:"♊️",ghost:"👻",gift:"🎁",gift_heart:"💝",girl:"👧",globe_with_meridians:"🌐",goal_net:"🥅",goat:"🐐",golf:"⛳️",golfing_man:"🏌️",golfing_woman:"🏌️‍♀️",gorilla:"🦍",grapes:"🍇",green_apple:"🍏",green_book:"📗",green_heart:"💚",green_salad:"🥗",grey_exclamation:"❕",grey_question:"❔",grimacing:"😬",grin:"😁",grinning:"😀",guardsman:"💂",guardswoman:"💂‍♀️",guitar:"🎸",gun:"🔫",haircut_woman:"💇",haircut_man:"💇‍♂️",hamburger:"🍔",hammer:"🔨",hammer_and_pick:"⚒",hammer_and_wrench:"🛠",hamster:"🐹",hand:"✋",handbag:"👜",handshake:"🤝",hankey:"💩",hatched_chick:"🐥",hatching_chick:"🐣",headphones:"🎧",hear_no_evil:"🙉",heart:"❤️",heart_decoration:"💟",heart_eyes:"😍",heart_eyes_cat:"😻",heartbeat:"💓",heartpulse:"💗",hearts:"♥️",heavy_check_mark:"✔️",heavy_division_sign:"➗",heavy_dollar_sign:"💲",heavy_heart_exclamation:"❣️",heavy_minus_sign:"➖",heavy_multiplication_x:"✖️",heavy_plus_sign:"➕",helicopter:"🚁",herb:"🌿",hibiscus:"🌺",high_brightness:"🔆",high_heel:"👠",hocho:"🔪",hole:"🕳",honey_pot:"🍯",horse:"🐴",horse_racing:"🏇",hospital:"🏥",hot_pepper:"🌶",hotdog:"🌭",hotel:"🏨",hotsprings:"♨️",hourglass:"⌛️",hourglass_flowing_sand:"⏳",house:"🏠",house_with_garden:"🏡",houses:"🏘",hugs:"🤗",hushed:"😯",ice_cream:"🍨",ice_hockey:"🏒",ice_skate:"⛸",icecream:"🍦",id:"🆔",ideograph_advantage:"🉐",imp:"👿",inbox_tray:"📥",incoming_envelope:"📨",tipping_hand_woman:"💁",information_source:"ℹ️",innocent:"😇",interrobang:"⁉️",iphone:"📱",izakaya_lantern:"🏮",jack_o_lantern:"🎃",japan:"🗾",japanese_castle:"🏯",japanese_goblin:"👺",japanese_ogre:"👹",jeans:"👖",joy:"😂",joy_cat:"😹",joystick:"🕹",kaaba:"🕋",key:"🔑",keyboard:"⌨️",keycap_ten:"🔟",kick_scooter:"🛴",kimono:"👘",kiss:"💋",kissing:"😗",kissing_cat:"😽",kissing_closed_eyes:"😚",kissing_heart:"😘",kissing_smiling_eyes:"😙",kiwi_fruit:"🥝",koala:"🐨",koko:"🈁",label:"🏷",large_blue_circle:"🔵",large_blue_diamond:"🔷",large_orange_diamond:"🔶",last_quarter_moon:"🌗",last_quarter_moon_with_face:"🌜",latin_cross:"✝️",laughing:"😆",leaves:"🍃",ledger:"📒",left_luggage:"🛅",left_right_arrow:"↔️",leftwards_arrow_with_hook:"↩️",lemon:"🍋",leo:"♌️",leopard:"🐆",level_slider:"🎚",libra:"♎️",light_rail:"🚈",link:"🔗",lion:"🦁",lips:"👄",lipstick:"💄",lizard:"🦎",lock:"🔒",lock_with_ink_pen:"🔏",lollipop:"🍭",loop:"➿",loud_sound:"🔊",loudspeaker:"📢",love_hotel:"🏩",love_letter:"💌",low_brightness:"🔅",lying_face:"🤥",m:"Ⓜ️",mag:"🔍",mag_right:"🔎",mahjong:"🀄️",mailbox:"📫",mailbox_closed:"📪",mailbox_with_mail:"📬",mailbox_with_no_mail:"📭",man:"👨",man_artist:"👨‍🎨",man_astronaut:"👨‍🚀",man_cartwheeling:"🤸‍♂️",man_cook:"👨‍🍳",man_dancing:"🕺",man_facepalming:"🤦‍♂️",man_factory_worker:"👨‍🏭",man_farmer:"👨‍🌾",man_firefighter:"👨‍🚒",man_health_worker:"👨‍⚕️",man_in_tuxedo:"🤵",man_judge:"👨‍⚖️",man_juggling:"🤹‍♂️",man_mechanic:"👨‍🔧",man_office_worker:"👨‍💼",man_pilot:"👨‍✈️",man_playing_handball:"🤾‍♂️",man_playing_water_polo:"🤽‍♂️",man_scientist:"👨‍🔬",man_shrugging:"🤷‍♂️",man_singer:"👨‍🎤",man_student:"👨‍🎓",man_teacher:"👨‍🏫",man_technologist:"👨‍💻",man_with_gua_pi_mao:"👲",man_with_turban:"👳",tangerine:"🍊",mans_shoe:"👞",mantelpiece_clock:"🕰",maple_leaf:"🍁",martial_arts_uniform:"🥋",mask:"😷",massage_woman:"💆",massage_man:"💆‍♂️",meat_on_bone:"🍖",medal_military:"🎖",medal_sports:"🏅",mega:"📣",melon:"🍈",memo:"📝",men_wrestling:"🤼‍♂️",menorah:"🕎",mens:"🚹",metal:"🤘",metro:"🚇",microphone:"🎤",microscope:"🔬",milk_glass:"🥛",milky_way:"🌌",minibus:"🚐",minidisc:"💽",mobile_phone_off:"📴",money_mouth_face:"🤑",money_with_wings:"💸",moneybag:"💰",monkey:"🐒",monkey_face:"🐵",monorail:"🚝",moon:"🌔",mortar_board:"🎓",mosque:"🕌",motor_boat:"🛥",motor_scooter:"🛵",motorcycle:"🏍",motorway:"🛣",mount_fuji:"🗻",mountain:"⛰",mountain_biking_man:"🚵",mountain_biking_woman:"🚵‍♀️",mountain_cableway:"🚠",mountain_railway:"🚞",mountain_snow:"🏔",mouse:"🐭",mouse2:"🐁",movie_camera:"🎥",moyai:"🗿",mrs_claus:"🤶",muscle:"💪",mushroom:"🍄",musical_keyboard:"🎹",musical_note:"🎵",musical_score:"🎼",mute:"🔇",nail_care:"💅",name_badge:"📛",national_park:"🏞",nauseated_face:"🤢",necktie:"👔",negative_squared_cross_mark:"❎",nerd_face:"🤓",neutral_face:"😐",new:"🆕",new_moon:"🌑",new_moon_with_face:"🌚",newspaper:"📰",newspaper_roll:"🗞",next_track_button:"⏭",ng:"🆖",no_good_man:"🙅‍♂️",no_good_woman:"🙅",night_with_stars:"🌃",no_bell:"🔕",no_bicycles:"🚳",no_entry:"⛔️",no_entry_sign:"🚫",no_mobile_phones:"📵",no_mouth:"😶",no_pedestrians:"🚷",no_smoking:"🚭","non-potable_water":"🚱",nose:"👃",notebook:"📓",notebook_with_decorative_cover:"📔",notes:"🎶",nut_and_bolt:"🔩",o:"⭕️",o2:"🅾️",ocean:"🌊",octopus:"🐙",oden:"🍢",office:"🏢",oil_drum:"🛢",ok:"🆗",ok_hand:"👌",ok_man:"🙆‍♂️",ok_woman:"🙆",old_key:"🗝",older_man:"👴",older_woman:"👵",om:"🕉",on:"🔛",oncoming_automobile:"🚘",oncoming_bus:"🚍",oncoming_police_car:"🚔",oncoming_taxi:"🚖",open_file_folder:"📂",open_hands:"👐",open_mouth:"😮",open_umbrella:"☂️",ophiuchus:"⛎",orange_book:"📙",orthodox_cross:"☦️",outbox_tray:"📤",owl:"🦉",ox:"🐂",package:"📦",page_facing_up:"📄",page_with_curl:"📃",pager:"📟",paintbrush:"🖌",palm_tree:"🌴",pancakes:"🥞",panda_face:"🐼",paperclip:"📎",paperclips:"🖇",parasol_on_ground:"⛱",parking:"🅿️",part_alternation_mark:"〽️",partly_sunny:"⛅️",passenger_ship:"🛳",passport_control:"🛂",pause_button:"⏸",peace_symbol:"☮️",peach:"🍑",peanuts:"🥜",pear:"🍐",pen:"🖊",pencil2:"✏️",penguin:"🐧",pensive:"😔",performing_arts:"🎭",persevere:"😣",person_fencing:"🤺",pouting_woman:"🙎",phone:"☎️",pick:"⛏",pig:"🐷",pig2:"🐖",pig_nose:"🐽",pill:"💊",pineapple:"🍍",ping_pong:"🏓",pisces:"♓️",pizza:"🍕",place_of_worship:"🛐",plate_with_cutlery:"🍽",play_or_pause_button:"⏯",point_down:"👇",point_left:"👈",point_right:"👉",point_up:"☝️",point_up_2:"👆",police_car:"🚓",policewoman:"👮‍♀️",poodle:"🐩",popcorn:"🍿",post_office:"🏣",postal_horn:"📯",postbox:"📮",potable_water:"🚰",potato:"🥔",pouch:"👝",poultry_leg:"🍗",pound:"💷",rage:"😡",pouting_cat:"😾",pouting_man:"🙎‍♂️",pray:"🙏",prayer_beads:"📿",pregnant_woman:"🤰",previous_track_button:"⏮",prince:"🤴",princess:"👸",printer:"🖨",purple_heart:"💜",purse:"👛",pushpin:"📌",put_litter_in_its_place:"🚮",question:"❓",rabbit:"🐰",rabbit2:"🐇",racehorse:"🐎",racing_car:"🏎",radio:"📻",radio_button:"🔘",radioactive:"☢️",railway_car:"🚃",railway_track:"🛤",rainbow:"🌈",rainbow_flag:"🏳️‍🌈",raised_back_of_hand:"🤚",raised_hand_with_fingers_splayed:"🖐",raised_hands:"🙌",raising_hand_woman:"🙋",raising_hand_man:"🙋‍♂️",ram:"🐏",ramen:"🍜",rat:"🐀",record_button:"⏺",recycle:"♻️",red_circle:"🔴",registered:"®️",relaxed:"☺️",relieved:"😌",reminder_ribbon:"🎗",repeat:"🔁",repeat_one:"🔂",rescue_worker_helmet:"⛑",restroom:"🚻",revolving_hearts:"💞",rewind:"⏪",rhinoceros:"🦏",ribbon:"🎀",rice:"🍚",rice_ball:"🍙",rice_cracker:"🍘",rice_scene:"🎑",right_anger_bubble:"🗯",ring:"💍",robot:"🤖",rocket:"🚀",rofl:"🤣",roll_eyes:"🙄",roller_coaster:"🎢",rooster:"🐓",rose:"🌹",rosette:"🏵",rotating_light:"🚨",round_pushpin:"📍",rowing_man:"🚣",rowing_woman:"🚣‍♀️",rugby_football:"🏉",running_man:"🏃",running_shirt_with_sash:"🎽",running_woman:"🏃‍♀️",sa:"🈂️",sagittarius:"♐️",sake:"🍶",sandal:"👡",santa:"🎅",satellite:"📡",saxophone:"🎷",school:"🏫",school_satchel:"🎒",scissors:"✂️",scorpion:"🦂",scorpius:"♏️",scream:"😱",scream_cat:"🙀",scroll:"📜",seat:"💺",secret:"㊙️",see_no_evil:"🙈",seedling:"🌱",selfie:"🤳",shallow_pan_of_food:"🥘",shamrock:"☘️",shark:"🦈",shaved_ice:"🍧",sheep:"🐑",shell:"🐚",shield:"🛡",shinto_shrine:"⛩",ship:"🚢",shirt:"👕",shopping:"🛍",shopping_cart:"🛒",shower:"🚿",shrimp:"🦐",signal_strength:"📶",six_pointed_star:"🔯",ski:"🎿",skier:"⛷",skull:"💀",skull_and_crossbones:"☠️",sleeping:"😴",sleeping_bed:"🛌",sleepy:"😪",slightly_frowning_face:"🙁",slightly_smiling_face:"🙂",slot_machine:"🎰",small_airplane:"🛩",small_blue_diamond:"🔹",small_orange_diamond:"🔸",small_red_triangle:"🔺",small_red_triangle_down:"🔻",smile:"😄",smile_cat:"😸",smiley:"😃",smiley_cat:"😺",smiling_imp:"😈",smirk:"😏",smirk_cat:"😼",smoking:"🚬",snail:"🐌",snake:"🐍",sneezing_face:"🤧",snowboarder:"🏂",snowflake:"❄️",snowman:"⛄️",snowman_with_snow:"☃️",sob:"😭",soccer:"⚽️",soon:"🔜",sos:"🆘",sound:"🔉",space_invader:"👾",spades:"♠️",spaghetti:"🍝",sparkle:"❇️",sparkler:"🎇",sparkles:"✨",sparkling_heart:"💖",speak_no_evil:"🙊",speaker:"🔈",speaking_head:"🗣",speech_balloon:"💬",speedboat:"🚤",spider:"🕷",spider_web:"🕸",spiral_calendar:"🗓",spiral_notepad:"🗒",spoon:"🥄",squid:"🦑",stadium:"🏟",star:"⭐️",star2:"🌟",star_and_crescent:"☪️",star_of_david:"✡️",stars:"🌠",station:"🚉",statue_of_liberty:"🗽",steam_locomotive:"🚂",stew:"🍲",stop_button:"⏹",stop_sign:"🛑",stopwatch:"⏱",straight_ruler:"📏",strawberry:"🍓",stuck_out_tongue:"😛",stuck_out_tongue_closed_eyes:"😝",stuck_out_tongue_winking_eye:"😜",studio_microphone:"🎙",stuffed_flatbread:"🥙",sun_behind_large_cloud:"🌥",sun_behind_rain_cloud:"🌦",sun_behind_small_cloud:"🌤",sun_with_face:"🌞",sunflower:"🌻",sunglasses:"😎",sunny:"☀️",sunrise:"🌅",sunrise_over_mountains:"🌄",surfing_man:"🏄",surfing_woman:"🏄‍♀️",sushi:"🍣",suspension_railway:"🚟",sweat:"😓",sweat_drops:"💦",sweat_smile:"😅",sweet_potato:"🍠",swimming_man:"🏊",swimming_woman:"🏊‍♀️",symbols:"🔣",synagogue:"🕍",syringe:"💉",taco:"🌮",tada:"🎉",tanabata_tree:"🎋",taurus:"♉️",taxi:"🚕",tea:"🍵",telephone_receiver:"📞",telescope:"🔭",tennis:"🎾",tent:"⛺️",thermometer:"🌡",thinking:"🤔",thought_balloon:"💭",ticket:"🎫",tickets:"🎟",tiger:"🐯",tiger2:"🐅",timer_clock:"⏲",tipping_hand_man:"💁‍♂️",tired_face:"😫",tm:"™️",toilet:"🚽",tokyo_tower:"🗼",tomato:"🍅",tongue:"👅",top:"🔝",tophat:"🎩",tornado:"🌪",trackball:"🖲",tractor:"🚜",traffic_light:"🚥",train:"🚋",train2:"🚆",tram:"🚊",triangular_flag_on_post:"🚩",triangular_ruler:"📐",trident:"🔱",triumph:"😤",trolleybus:"🚎",trophy:"🏆",tropical_drink:"🍹",tropical_fish:"🐠",truck:"🚚",trumpet:"🎺",tulip:"🌷",tumbler_glass:"🥃",turkey:"🦃",turtle:"🐢",tv:"📺",twisted_rightwards_arrows:"🔀",two_hearts:"💕",two_men_holding_hands:"👬",two_women_holding_hands:"👭",u5272:"🈹",u5408:"🈴",u55b6:"🈺",u6307:"🈯️",u6708:"🈷️",u6709:"🈶",u6e80:"🈵",u7121:"🈚️",u7533:"🈸",u7981:"🈲",u7a7a:"🈳",umbrella:"☔️",unamused:"😒",underage:"🔞",unicorn:"🦄",unlock:"🔓",up:"🆙",upside_down_face:"🙃",v:"✌️",vertical_traffic_light:"🚦",vhs:"📼",vibration_mode:"📳",video_camera:"📹",video_game:"🎮",violin:"🎻",virgo:"♍️",volcano:"🌋",volleyball:"🏐",vs:"🆚",vulcan_salute:"🖖",walking_man:"🚶",walking_woman:"🚶‍♀️",waning_crescent_moon:"🌘",waning_gibbous_moon:"🌖",warning:"⚠️",wastebasket:"🗑",watch:"⌚️",water_buffalo:"🐃",watermelon:"🍉",wave:"👋",wavy_dash:"〰️",waxing_crescent_moon:"🌒",wc:"🚾",weary:"😩",wedding:"💒",weight_lifting_man:"🏋️",weight_lifting_woman:"🏋️‍♀️",whale:"🐳",whale2:"🐋",wheel_of_dharma:"☸️",wheelchair:"♿️",white_check_mark:"✅",white_circle:"⚪️",white_flag:"🏳️",white_flower:"💮",white_large_square:"⬜️",white_medium_small_square:"◽️",white_medium_square:"◻️",white_small_square:"▫️",white_square_button:"🔳",wilted_flower:"🥀",wind_chime:"🎐",wind_face:"🌬",wine_glass:"🍷",wink:"😉",wolf:"🐺",woman:"👩",woman_artist:"👩‍🎨",woman_astronaut:"👩‍🚀",woman_cartwheeling:"🤸‍♀️",woman_cook:"👩‍🍳",woman_facepalming:"🤦‍♀️",woman_factory_worker:"👩‍🏭",woman_farmer:"👩‍🌾",woman_firefighter:"👩‍🚒",woman_health_worker:"👩‍⚕️",woman_judge:"👩‍⚖️",woman_juggling:"🤹‍♀️",woman_mechanic:"👩‍🔧",woman_office_worker:"👩‍💼",woman_pilot:"👩‍✈️",woman_playing_handball:"🤾‍♀️",woman_playing_water_polo:"🤽‍♀️",woman_scientist:"👩‍🔬",woman_shrugging:"🤷‍♀️",woman_singer:"👩‍🎤",woman_student:"👩‍🎓",woman_teacher:"👩‍🏫",woman_technologist:"👩‍💻",woman_with_turban:"👳‍♀️",womans_clothes:"👚",womans_hat:"👒",women_wrestling:"🤼‍♀️",womens:"🚺",world_map:"🗺",worried:"😟",wrench:"🔧",writing_hand:"✍️",x:"❌",yellow_heart:"💛",yen:"💴",yin_yang:"☯️",yum:"😋",zap:"⚡️",zipper_mouth_face:"🤐",zzz:"💤",octocat:'<img alt=":octocat:" height="20" width="20" align="absmiddle" src="https://assets-cdn.github.com/images/icons/emoji/octocat.png">',showdown:"<span style=\"font-family: 'Anonymous Pro', monospace; text-decoration: underline; text-decoration-style: dashed; text-decoration-color: #3e8b8a;text-underline-position: under;\">S</span>"},a.Converter=function(e){"use strict";function t(e,t){if(t=t||null,a.helper.isString(e)){if(e=a.helper.stdExtName(e),t=e,a.extensions[e])return console.warn("DEPRECATION WARNING: "+e+" is an old extension that uses a deprecated loading method.Please inform the developer that the extension should be updated!"),void function(e,t){"function"==typeof e&&(e=e(new a.Converter));a.helper.isArray(e)||(e=[e]);var n=r(e,t);if(!n.valid)throw Error(n.error);for(var s=0;s<e.length;++s)switch(e[s].type){case"lang":u.push(e[s]);break;case"output":d.push(e[s]);break;default:throw Error("Extension loader error: Type unrecognized!!!")}}(a.extensions[e],e);if(a.helper.isUndefined(s[e]))throw Error('Extension "'+e+'" could not be loaded. It was either not found or is not a valid extension.');e=s[e]}"function"==typeof e&&(e=e()),a.helper.isArray(e)||(e=[e]);var o=r(e,t);if(!o.valid)throw Error(o.error);for(var i=0;i<e.length;++i){switch(e[i].type){case"lang":u.push(e[i]);break;case"output":d.push(e[i])}if(e[i].hasOwnProperty("listeners"))for(var l in e[i].listeners)e[i].listeners.hasOwnProperty(l)&&n(l,e[i].listeners[l])}}function n(e,r){if(!a.helper.isString(e))throw Error("Invalid argument in converter.listen() method: name must be a string, but "+typeof e+" given");if("function"!=typeof r)throw Error("Invalid argument in converter.listen() method: callback must be a function, but "+typeof r+" given");p.hasOwnProperty(e)||(p[e]=[]),p[e].push(r)}var c={},u=[],d=[],p={},h=i,_={parsed:{},raw:"",format:""};!function(){e=e||{};for(var r in o)o.hasOwnProperty(r)&&(c[r]=o[r]);if("object"!=typeof e)throw Error("Converter expects the passed parameter to be an object, but "+typeof e+" was passed instead.");for(var n in e)e.hasOwnProperty(n)&&(c[n]=e[n]);c.extensions&&a.helper.forEach(c.extensions,t)}(),this._dispatch=function(e,r,t,a){if(p.hasOwnProperty(e))for(var n=0;n<p[e].length;++n){var s=p[e][n](e,r,this,t,a);s&&void 0!==s&&(r=s)}return r},this.listen=function(e,r){return n(e,r),this},this.makeHtml=function(e){if(!e)return e;var r={gHtmlBlocks:[],gHtmlMdBlocks:[],gHtmlSpans:[],gUrls:{},gTitles:{},gDimensions:{},gListLevel:0,hashLinkCounts:{},langExtensions:u,outputModifiers:d,converter:this,ghCodeBlocks:[],metadata:{parsed:{},raw:"",format:""}};return e=e.replace(/¨/g,"¨T"),e=e.replace(/\$/g,"¨D"),e=e.replace(/\r\n/g,"\n"),e=e.replace(/\r/g,"\n"),e=e.replace(/\u00A0/g," "),c.smartIndentationFix&&(e=function(e){var r=e.match(/^\s*/)[0].length,t=new RegExp("^\\s{0,"+r+"}","gm");return e.replace(t,"")}(e)),e="\n\n"+e+"\n\n",e=a.subParser("detab")(e,c,r),e=e.replace(/^[ \t]+$/gm,""),a.helper.forEach(u,function(t){e=a.subParser("runExtension")(t,e,c,r)}),e=a.subParser("metadata")(e,c,r),e=a.subParser("hashPreCodeTags")(e,c,r),e=a.subParser("githubCodeBlocks")(e,c,r),e=a.subParser("hashHTMLBlocks")(e,c,r),e=a.subParser("hashCodeTags")(e,c,r),e=a.subParser("stripLinkDefinitions")(e,c,r),e=a.subParser("blockGamut")(e,c,r),e=a.subParser("unhashHTMLSpans")(e,c,r),e=a.subParser("unescapeSpecialChars")(e,c,r),e=e.replace(/¨D/g,"$$"),e=e.replace(/¨T/g,"¨"),e=a.subParser("completeHTMLDocument")(e,c,r),a.helper.forEach(d,function(t){e=a.subParser("runExtension")(t,e,c,r)}),_=r.metadata,e},this.makeMarkdown=this.makeMd=function(e,r){function t(e){for(var r=0;r<e.childNodes.length;++r){var a=e.childNodes[r];3===a.nodeType?/\S/.test(a.nodeValue)?(a.nodeValue=a.nodeValue.split("\n").join(" "),a.nodeValue=a.nodeValue.replace(/(\s)+/g,"$1")):(e.removeChild(a),--r):1===a.nodeType&&t(a)}}if(e=e.replace(/\r\n/g,"\n"),e=e.replace(/\r/g,"\n"),e=e.replace(/>[ \t]+</,">¨NBSP;<"),!r){if(!window||!window.document)throw new Error("HTMLParser is undefined. If in a webworker or nodejs environment, you need to provide a WHATWG DOM and HTML such as JSDOM");r=window.document}var n=r.createElement("div");n.innerHTML=e;var s={preList:function(e){for(var r=e.querySelectorAll("pre"),t=[],n=0;n<r.length;++n)if(1===r[n].childElementCount&&"code"===r[n].firstChild.tagName.toLowerCase()){var s=r[n].firstChild.innerHTML.trim(),o=r[n].firstChild.getAttribute("data-language")||"";if(""===o)for(var i=r[n].firstChild.className.split(" "),l=0;l<i.length;++l){var c=i[l].match(/^language-(.+)$/);if(null!==c){o=c[1];break}}s=a.helper.unescapeHTMLEntities(s),t.push(s),r[n].outerHTML='<precode language="'+o+'" precodenum="'+n.toString()+'"></precode>'}else t.push(r[n].innerHTML),r[n].innerHTML="",r[n].setAttribute("prenum",n.toString());return t}(n)};t(n);for(var o=n.childNodes,i="",l=0;l<o.length;l++)i+=a.subParser("makeMarkdown.node")(o[l],s);return i},this.setOption=function(e,r){c[e]=r},this.getOption=function(e){return c[e]},this.getOptions=function(){return c},this.addExtension=function(e,r){t(e,r=r||null)},this.useExtension=function(e){t(e)},this.setFlavor=function(e){if(!l.hasOwnProperty(e))throw Error(e+" flavor was not found");var r=l[e];h=e;for(var t in r)r.hasOwnProperty(t)&&(c[t]=r[t])},this.getFlavor=function(){return h},this.removeExtension=function(e){a.helper.isArray(e)||(e=[e]);for(var r=0;r<e.length;++r){for(var t=e[r],n=0;n<u.length;++n)u[n]===t&&u[n].splice(n,1);for(;0<d.length;++n)d[0]===t&&d[0].splice(n,1)}},this.getAllExtensions=function(){return{language:u,output:d}},this.getMetadata=function(e){return e?_.raw:_.parsed},this.getMetadataFormat=function(){return _.format},this._setMetadataPair=function(e,r){_.parsed[e]=r},this._setMetadataFormat=function(e){_.format=e},this._setMetadataRaw=function(e){_.raw=e}},a.subParser("anchors",function(e,r,t){"use strict";var n=function(e,n,s,o,i,l,c){if(a.helper.isUndefined(c)&&(c=""),s=s.toLowerCase(),e.search(/\(<?\s*>? ?(['"].*['"])?\)$/m)>-1)o="";else if(!o){if(s||(s=n.toLowerCase().replace(/ ?\n/g," ")),o="#"+s,a.helper.isUndefined(t.gUrls[s]))return e;o=t.gUrls[s],a.helper.isUndefined(t.gTitles[s])||(c=t.gTitles[s])}var u='<a href="'+(o=o.replace(a.helper.regexes.asteriskDashAndColon,a.helper.escapeCharactersCallback))+'"';return""!==c&&null!==c&&(u+=' title="'+(c=(c=c.replace(/"/g,""")).replace(a.helper.regexes.asteriskDashAndColon,a.helper.escapeCharactersCallback))+'"'),r.openLinksInNewWindow&&!/^#/.test(o)&&(u+=' rel="noopener noreferrer" target="¨E95Eblank"'),u+=">"+n+"</a>"};return e=(e=t.converter._dispatch("anchors.before",e,r,t)).replace(/\[((?:\[[^\]]*]|[^\[\]])*)] ?(?:\n *)?\[(.*?)]()()()()/g,n),e=e.replace(/\[((?:\[[^\]]*]|[^\[\]])*)]()[ \t]*\([ \t]?<([^>]*)>(?:[ \t]*((["'])([^"]*?)\5))?[ \t]?\)/g,n),e=e.replace(/\[((?:\[[^\]]*]|[^\[\]])*)]()[ \t]*\([ \t]?<?([\S]+?(?:\([\S]*?\)[\S]*?)?)>?(?:[ \t]*((["'])([^"]*?)\5))?[ \t]?\)/g,n),e=e.replace(/\[([^\[\]]+)]()()()()()/g,n),r.ghMentions&&(e=e.replace(/(^|\s)(\\)?(@([a-z\d]+(?:[a-z\d.-]+?[a-z\d]+)*))/gim,function(e,t,n,s,o){if("\\"===n)return t+s;if(!a.helper.isString(r.ghMentionsLink))throw new Error("ghMentionsLink option must be a string");var i=r.ghMentionsLink.replace(/\{u}/g,o),l="";return r.openLinksInNewWindow&&(l=' rel="noopener noreferrer" target="¨E95Eblank"'),t+'<a href="'+i+'"'+l+">"+s+"</a>"})),e=t.converter._dispatch("anchors.after",e,r,t)});var u=/([*~_]+|\b)(((https?|ftp|dict):\/\/|www\.)[^'">\s]+?\.[^'">\s]+?)()(\1)?(?=\s|$)(?!["<>])/gi,d=/([*~_]+|\b)(((https?|ftp|dict):\/\/|www\.)[^'">\s]+\.[^'">\s]+?)([.!?,()\[\]])?(\1)?(?=\s|$)(?!["<>])/gi,p=/()<(((https?|ftp|dict):\/\/|www\.)[^'">\s]+)()>()/gi,h=/(^|\s)(?:mailto:)?([A-Za-z0-9!#$%&'*+-/=?^_`{|}~.]+@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)(?=$|\s)/gim,_=/<()(?:mailto:)?([-.\w]+@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)>/gi,g=function(e){"use strict";return function(r,t,n,s,o,i,l){var c=n=n.replace(a.helper.regexes.asteriskDashAndColon,a.helper.escapeCharactersCallback),u="",d="",p=t||"",h=l||"";return/^www\./i.test(n)&&(n=n.replace(/^www\./i,"http://www.")),e.excludeTrailingPunctuationFromURLs&&i&&(u=i),e.openLinksInNewWindow&&(d=' rel="noopener noreferrer" target="¨E95Eblank"'),p+'<a href="'+n+'"'+d+">"+c+"</a>"+u+h}},m=function(e,r){"use strict";return function(t,n,s){var o="mailto:";return n=n||"",s=a.subParser("unescapeSpecialChars")(s,e,r),e.encodeEmails?(o=a.helper.encodeEmailAddress(o+s),s=a.helper.encodeEmailAddress(s)):o+=s,n+'<a href="'+o+'">'+s+"</a>"}};a.subParser("autoLinks",function(e,r,t){"use strict";return e=t.converter._dispatch("autoLinks.before",e,r,t),e=e.replace(p,g(r)),e=e.replace(_,m(r,t)),e=t.converter._dispatch("autoLinks.after",e,r,t)}),a.subParser("simplifiedAutoLinks",function(e,r,t){"use strict";return r.simplifiedAutoLink?(e=t.converter._dispatch("simplifiedAutoLinks.before",e,r,t),e=r.excludeTrailingPunctuationFromURLs?e.replace(d,g(r)):e.replace(u,g(r)),e=e.replace(h,m(r,t)),e=t.converter._dispatch("simplifiedAutoLinks.after",e,r,t)):e}),a.subParser("blockGamut",function(e,r,t){"use strict";return e=t.converter._dispatch("blockGamut.before",e,r,t),e=a.subParser("blockQuotes")(e,r,t),e=a.subParser("headers")(e,r,t),e=a.subParser("horizontalRule")(e,r,t),e=a.subParser("lists")(e,r,t),e=a.subParser("codeBlocks")(e,r,t),e=a.subParser("tables")(e,r,t),e=a.subParser("hashHTMLBlocks")(e,r,t),e=a.subParser("paragraphs")(e,r,t),e=t.converter._dispatch("blockGamut.after",e,r,t)}),a.subParser("blockQuotes",function(e,r,t){"use strict";e=t.converter._dispatch("blockQuotes.before",e,r,t),e+="\n\n";var n=/(^ {0,3}>[ \t]?.+\n(.+\n)*\n*)+/gm;return r.splitAdjacentBlockquotes&&(n=/^ {0,3}>[\s\S]*?(?:\n\n)/gm),e=e.replace(n,function(e){return e=e.replace(/^[ \t]*>[ \t]?/gm,""),e=e.replace(/¨0/g,""),e=e.replace(/^[ \t]+$/gm,""),e=a.subParser("githubCodeBlocks")(e,r,t),e=a.subParser("blockGamut")(e,r,t),e=e.replace(/(^|\n)/g,"$1 "),e=e.replace(/(\s*<pre>[^\r]+?<\/pre>)/gm,function(e,r){var t=r;return t=t.replace(/^ /gm,"¨0"),t=t.replace(/¨0/g,"")}),a.subParser("hashBlock")("<blockquote>\n"+e+"\n</blockquote>",r,t)}),e=t.converter._dispatch("blockQuotes.after",e,r,t)}),a.subParser("codeBlocks",function(e,r,t){"use strict";e=t.converter._dispatch("codeBlocks.before",e,r,t);return e=(e+="¨0").replace(/(?:\n\n|^)((?:(?:[ ]{4}|\t).*\n+)+)(\n*[ ]{0,3}[^ \t\n]|(?=¨0))/g,function(e,n,s){var o=n,i=s,l="\n";return o=a.subParser("outdent")(o,r,t),o=a.subParser("encodeCode")(o,r,t),o=a.subParser("detab")(o,r,t),o=o.replace(/^\n+/g,""),o=o.replace(/\n+$/g,""),r.omitExtraWLInCodeBlocks&&(l=""),o="<pre><code>"+o+l+"</code></pre>",a.subParser("hashBlock")(o,r,t)+i}),e=e.replace(/¨0/,""),e=t.converter._dispatch("codeBlocks.after",e,r,t)}),a.subParser("codeSpans",function(e,r,t){"use strict";return void 0===(e=t.converter._dispatch("codeSpans.before",e,r,t))&&(e=""),e=e.replace(/(^|[^\\])(`+)([^\r]*?[^`])\2(?!`)/gm,function(e,n,s,o){var i=o;return i=i.replace(/^([ \t]*)/g,""),i=i.replace(/[ \t]*$/g,""),i=a.subParser("encodeCode")(i,r,t),i=n+"<code>"+i+"</code>",i=a.subParser("hashHTMLSpans")(i,r,t)}),e=t.converter._dispatch("codeSpans.after",e,r,t)}),a.subParser("completeHTMLDocument",function(e,r,t){"use strict";if(!r.completeHTMLDocument)return e;e=t.converter._dispatch("completeHTMLDocument.before",e,r,t);var a="html",n="<!DOCTYPE HTML>\n",s="",o='<meta charset="utf-8">\n',i="",l="";void 0!==t.metadata.parsed.doctype&&(n="<!DOCTYPE "+t.metadata.parsed.doctype+">\n","html"!==(a=t.metadata.parsed.doctype.toString().toLowerCase())&&"html5"!==a||(o='<meta charset="utf-8">'));for(var c in t.metadata.parsed)if(t.metadata.parsed.hasOwnProperty(c))switch(c.toLowerCase()){case"doctype":break;case"title":s="<title>"+t.metadata.parsed.title+"\n";break;case"charset":o="html"===a||"html5"===a?'\n':'\n';break;case"language":case"lang":i=' lang="'+t.metadata.parsed[c]+'"',l+='\n';break;default:l+='\n'}return e=n+"\n\n"+s+o+l+"\n\n"+e.trim()+"\n\n",e=t.converter._dispatch("completeHTMLDocument.after",e,r,t)}),a.subParser("detab",function(e,r,t){"use strict";return e=t.converter._dispatch("detab.before",e,r,t),e=e.replace(/\t(?=\t)/g," "),e=e.replace(/\t/g,"¨A¨B"),e=e.replace(/¨B(.+?)¨A/g,function(e,r){for(var t=r,a=4-t.length%4,n=0;n/g,">"),e=t.converter._dispatch("encodeAmpsAndAngles.after",e,r,t)}),a.subParser("encodeBackslashEscapes",function(e,r,t){"use strict";return e=t.converter._dispatch("encodeBackslashEscapes.before",e,r,t),e=e.replace(/\\(\\)/g,a.helper.escapeCharactersCallback),e=e.replace(/\\([`*_{}\[\]()>#+.!~=|-])/g,a.helper.escapeCharactersCallback),e=t.converter._dispatch("encodeBackslashEscapes.after",e,r,t)}),a.subParser("encodeCode",function(e,r,t){"use strict";return e=t.converter._dispatch("encodeCode.before",e,r,t),e=e.replace(/&/g,"&").replace(//g,">").replace(/([*_{}\[\]\\=~-])/g,a.helper.escapeCharactersCallback),e=t.converter._dispatch("encodeCode.after",e,r,t)}),a.subParser("escapeSpecialCharsWithinTagAttributes",function(e,r,t){"use strict";return e=(e=t.converter._dispatch("escapeSpecialCharsWithinTagAttributes.before",e,r,t)).replace(/<\/?[a-z\d_:-]+(?:[\s]+[\s\S]+?)?>/gi,function(e){return e.replace(/(.)<\/?code>(?=.)/g,"$1`").replace(/([\\`*_~=|])/g,a.helper.escapeCharactersCallback)}),e=e.replace(/-]|-[^>])(?:[^-]|-[^-])*)--)>/gi,function(e){return e.replace(/([\\`*_~=|])/g,a.helper.escapeCharactersCallback)}),e=t.converter._dispatch("escapeSpecialCharsWithinTagAttributes.after",e,r,t)}),a.subParser("githubCodeBlocks",function(e,r,t){"use strict";return r.ghCodeBlocks?(e=t.converter._dispatch("githubCodeBlocks.before",e,r,t),e+="¨0",e=e.replace(/(?:^|\n)(?: {0,3})(```+|~~~+)(?: *)([^\s`~]*)\n([\s\S]*?)\n(?: {0,3})\1/g,function(e,n,s,o){var i=r.omitExtraWLInCodeBlocks?"":"\n";return o=a.subParser("encodeCode")(o,r,t),o=a.subParser("detab")(o,r,t),o=o.replace(/^\n+/g,""),o=o.replace(/\n+$/g,""),o="

"+o+i+"
",o=a.subParser("hashBlock")(o,r,t),"\n\n¨G"+(t.ghCodeBlocks.push({text:e,codeblock:o})-1)+"G\n\n"}),e=e.replace(/¨0/,""),t.converter._dispatch("githubCodeBlocks.after",e,r,t)):e}),a.subParser("hashBlock",function(e,r,t){"use strict";return e=t.converter._dispatch("hashBlock.before",e,r,t),e=e.replace(/(^\n+|\n+$)/g,""),e="\n\n¨K"+(t.gHtmlBlocks.push(e)-1)+"K\n\n",e=t.converter._dispatch("hashBlock.after",e,r,t)}),a.subParser("hashCodeTags",function(e,r,t){"use strict";e=t.converter._dispatch("hashCodeTags.before",e,r,t);return e=a.helper.replaceRecursiveRegExp(e,function(e,n,s,o){var i=s+a.subParser("encodeCode")(n,r,t)+o;return"¨C"+(t.gHtmlSpans.push(i)-1)+"C"},"]*>","","gim"),e=t.converter._dispatch("hashCodeTags.after",e,r,t)}),a.subParser("hashElement",function(e,r,t){"use strict";return function(e,r){var a=r;return a=a.replace(/\n\n/g,"\n"),a=a.replace(/^\n/,""),a=a.replace(/\n+$/g,""),a="\n\n¨K"+(t.gHtmlBlocks.push(a)-1)+"K\n\n"}}),a.subParser("hashHTMLBlocks",function(e,r,t){"use strict";e=t.converter._dispatch("hashHTMLBlocks.before",e,r,t);var n=["pre","div","h1","h2","h3","h4","h5","h6","blockquote","table","dl","ol","ul","script","noscript","form","fieldset","iframe","math","style","section","header","footer","nav","article","aside","address","audio","canvas","figure","hgroup","output","video","p"],s=function(e,r,a,n){var s=e;return-1!==a.search(/\bmarkdown\b/)&&(s=a+t.converter.makeHtml(r)+n),"\n\n¨K"+(t.gHtmlBlocks.push(s)-1)+"K\n\n"};r.backslashEscapesHTMLTags&&(e=e.replace(/\\<(\/?[^>]+?)>/g,function(e,r){return"<"+r+">"}));for(var o=0;o]*>)","im"),c="<"+n[o]+"\\b[^>]*>",u="";-1!==(i=a.helper.regexIndexOf(e,l));){var d=a.helper.splitAtIndex(e,i),p=a.helper.replaceRecursiveRegExp(d[1],s,c,u,"im");if(p===d[1])break;e=d[0].concat(p)}return e=e.replace(/(\n {0,3}(<(hr)\b([^<>])*?\/?>)[ \t]*(?=\n{2,}))/g,a.subParser("hashElement")(e,r,t)),e=a.helper.replaceRecursiveRegExp(e,function(e){return"\n\n¨K"+(t.gHtmlBlocks.push(e)-1)+"K\n\n"},"^ {0,3}\x3c!--","--\x3e","gm"),e=e.replace(/(?:\n\n)( {0,3}(?:<([?%])[^\r]*?\2>)[ \t]*(?=\n{2,}))/g,a.subParser("hashElement")(e,r,t)),e=t.converter._dispatch("hashHTMLBlocks.after",e,r,t)}),a.subParser("hashHTMLSpans",function(e,r,t){"use strict";function a(e){return"¨C"+(t.gHtmlSpans.push(e)-1)+"C"}return e=t.converter._dispatch("hashHTMLSpans.before",e,r,t),e=e.replace(/<[^>]+?\/>/gi,function(e){return a(e)}),e=e.replace(/<([^>]+?)>[\s\S]*?<\/\1>/g,function(e){return a(e)}),e=e.replace(/<([^>]+?)\s[^>]+?>[\s\S]*?<\/\1>/g,function(e){return a(e)}),e=e.replace(/<[^>]+?>/gi,function(e){return a(e)}),e=t.converter._dispatch("hashHTMLSpans.after",e,r,t)}),a.subParser("unhashHTMLSpans",function(e,r,t){"use strict";e=t.converter._dispatch("unhashHTMLSpans.before",e,r,t);for(var a=0;a]*>\\s*]*>","^ {0,3}\\s*","gim"),e=t.converter._dispatch("hashPreCodeTags.after",e,r,t)}),a.subParser("headers",function(e,r,t){"use strict";function n(e){var n,s;if(r.customizedHeaderId){var o=e.match(/\{([^{]+?)}\s*$/);o&&o[1]&&(e=o[1])}return n=e,s=a.helper.isString(r.prefixHeaderId)?r.prefixHeaderId:!0===r.prefixHeaderId?"section-":"",r.rawPrefixHeaderId||(n=s+n),n=r.ghCompatibleHeaderId?n.replace(/ /g,"-").replace(/&/g,"").replace(/¨T/g,"").replace(/¨D/g,"").replace(/[&+$,\/:;=?@"#{}|^¨~\[\]`\\*)(%.!'<>]/g,"").toLowerCase():r.rawHeaderId?n.replace(/ /g,"-").replace(/&/g,"&").replace(/¨T/g,"¨").replace(/¨D/g,"$").replace(/["']/g,"-").toLowerCase():n.replace(/[^\w]/g,"").toLowerCase(),r.rawPrefixHeaderId&&(n=s+n),t.hashLinkCounts[n]?n=n+"-"+t.hashLinkCounts[n]++:t.hashLinkCounts[n]=1,n}e=t.converter._dispatch("headers.before",e,r,t);var s=isNaN(parseInt(r.headerLevelStart))?1:parseInt(r.headerLevelStart),o=r.smoothLivePreview?/^(.+)[ \t]*\n={2,}[ \t]*\n+/gm:/^(.+)[ \t]*\n=+[ \t]*\n+/gm,i=r.smoothLivePreview?/^(.+)[ \t]*\n-{2,}[ \t]*\n+/gm:/^(.+)[ \t]*\n-+[ \t]*\n+/gm;e=(e=e.replace(o,function(e,o){var i=a.subParser("spanGamut")(o,r,t),l=r.noHeaderId?"":' id="'+n(o)+'"',c=""+i+"";return a.subParser("hashBlock")(c,r,t)})).replace(i,function(e,o){var i=a.subParser("spanGamut")(o,r,t),l=r.noHeaderId?"":' id="'+n(o)+'"',c=s+1,u=""+i+"";return a.subParser("hashBlock")(u,r,t)});var l=r.requireSpaceBeforeHeadingText?/^(#{1,6})[ \t]+(.+?)[ \t]*#*\n+/gm:/^(#{1,6})[ \t]*(.+?)[ \t]*#*\n+/gm;return e=e.replace(l,function(e,o,i){var l=i;r.customizedHeaderId&&(l=i.replace(/\s?\{([^{]+?)}\s*$/,""));var c=a.subParser("spanGamut")(l,r,t),u=r.noHeaderId?"":' id="'+n(i)+'"',d=s-1+o.length,p=""+c+"";return a.subParser("hashBlock")(p,r,t)}),e=t.converter._dispatch("headers.after",e,r,t)}),a.subParser("horizontalRule",function(e,r,t){"use strict";e=t.converter._dispatch("horizontalRule.before",e,r,t);var n=a.subParser("hashBlock")("
",r,t);return e=e.replace(/^ {0,2}( ?-){3,}[ \t]*$/gm,n),e=e.replace(/^ {0,2}( ?\*){3,}[ \t]*$/gm,n),e=e.replace(/^ {0,2}( ?_){3,}[ \t]*$/gm,n),e=t.converter._dispatch("horizontalRule.after",e,r,t)}),a.subParser("images",function(e,r,t){"use strict";function n(e,r,n,s,o,i,l,c){var u=t.gUrls,d=t.gTitles,p=t.gDimensions;if(n=n.toLowerCase(),c||(c=""),e.search(/\(? ?(['"].*['"])?\)$/m)>-1)s="";else if(""===s||null===s){if(""!==n&&null!==n||(n=r.toLowerCase().replace(/ ?\n/g," ")),s="#"+n,a.helper.isUndefined(u[n]))return e;s=u[n],a.helper.isUndefined(d[n])||(c=d[n]),a.helper.isUndefined(p[n])||(o=p[n].width,i=p[n].height)}r=r.replace(/"/g,""").replace(a.helper.regexes.asteriskDashAndColon,a.helper.escapeCharactersCallback);var h=''+r+'"}return e=(e=t.converter._dispatch("images.before",e,r,t)).replace(/!\[([^\]]*?)] ?(?:\n *)?\[([\s\S]*?)]()()()()()/g,n),e=e.replace(/!\[([^\]]*?)][ \t]*()\([ \t]??(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*(?:(["'])([^"]*?)\6)?[ \t]?\)/g,function(e,r,t,a,s,o,i,l){return a=a.replace(/\s/g,""),n(e,r,t,a,s,o,0,l)}),e=e.replace(/!\[([^\]]*?)][ \t]*()\([ \t]?<([^>]*)>(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*(?:(?:(["'])([^"]*?)\6))?[ \t]?\)/g,n),e=e.replace(/!\[([^\]]*?)][ \t]*()\([ \t]??(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*(?:(["'])([^"]*?)\6)?[ \t]?\)/g,n),e=e.replace(/!\[([^\[\]]+)]()()()()()/g,n),e=t.converter._dispatch("images.after",e,r,t)}),a.subParser("italicsAndBold",function(e,r,t){"use strict";function a(e,r,t){return r+e+t}return e=t.converter._dispatch("italicsAndBold.before",e,r,t),e=r.literalMidWordUnderscores?(e=(e=e.replace(/\b___(\S[\s\S]*?)___\b/g,function(e,r){return a(r,"","")})).replace(/\b__(\S[\s\S]*?)__\b/g,function(e,r){return a(r,"","")})).replace(/\b_(\S[\s\S]*?)_\b/g,function(e,r){return a(r,"","")}):(e=(e=e.replace(/___(\S[\s\S]*?)___/g,function(e,r){return/\S$/.test(r)?a(r,"",""):e})).replace(/__(\S[\s\S]*?)__/g,function(e,r){return/\S$/.test(r)?a(r,"",""):e})).replace(/_([^\s_][\s\S]*?)_/g,function(e,r){return/\S$/.test(r)?a(r,"",""):e}),e=r.literalMidWordAsterisks?(e=(e=e.replace(/([^*]|^)\B\*\*\*(\S[\s\S]*?)\*\*\*\B(?!\*)/g,function(e,r,t){return a(t,r+"","")})).replace(/([^*]|^)\B\*\*(\S[\s\S]*?)\*\*\B(?!\*)/g,function(e,r,t){return a(t,r+"","")})).replace(/([^*]|^)\B\*(\S[\s\S]*?)\*\B(?!\*)/g,function(e,r,t){return a(t,r+"","")}):(e=(e=e.replace(/\*\*\*(\S[\s\S]*?)\*\*\*/g,function(e,r){return/\S$/.test(r)?a(r,"",""):e})).replace(/\*\*(\S[\s\S]*?)\*\*/g,function(e,r){return/\S$/.test(r)?a(r,"",""):e})).replace(/\*([^\s*][\s\S]*?)\*/g,function(e,r){return/\S$/.test(r)?a(r,"",""):e}),e=t.converter._dispatch("italicsAndBold.after",e,r,t)}),a.subParser("lists",function(e,r,t){"use strict";function n(e,n){t.gListLevel++,e=e.replace(/\n{2,}$/,"\n");var s=/(\n)?(^ {0,3})([*+-]|\d+[.])[ \t]+((\[(x|X| )?])?[ \t]*[^\r]+?(\n{1,2}))(?=\n*(¨0| {0,3}([*+-]|\d+[.])[ \t]+))/gm,o=/\n[ \t]*\n(?!¨0)/.test(e+="¨0");return r.disableForced4SpacesIndentedSublists&&(s=/(\n)?(^ {0,3})([*+-]|\d+[.])[ \t]+((\[(x|X| )?])?[ \t]*[^\r]+?(\n{1,2}))(?=\n*(¨0|\2([*+-]|\d+[.])[ \t]+))/gm),e=e.replace(s,function(e,n,s,i,l,c,u){u=u&&""!==u.trim();var d=a.subParser("outdent")(l,r,t),p="";return c&&r.tasklists&&(p=' class="task-list-item" style="list-style-type: none;"',d=d.replace(/^[ \t]*\[(x|X| )?]/m,function(){var e='-1?(d=a.subParser("githubCodeBlocks")(d,r,t),d=a.subParser("blockGamut")(d,r,t)):(d=(d=a.subParser("lists")(d,r,t)).replace(/\n$/,""),d=(d=a.subParser("hashHTMLBlocks")(d,r,t)).replace(/\n\n+/g,"\n\n"),d=o?a.subParser("paragraphs")(d,r,t):a.subParser("spanGamut")(d,r,t)),d=d.replace("¨A",""),d=""+d+"\n"}),e=e.replace(/¨0/g,""),t.gListLevel--,n&&(e=e.replace(/\s+$/,"")),e}function s(e,r){if("ol"===r){var t=e.match(/^ *(\d+)\./);if(t&&"1"!==t[1])return' start="'+t[1]+'"'}return""}function o(e,t,a){var o=r.disableForced4SpacesIndentedSublists?/^ ?\d+\.[ \t]/gm:/^ {0,3}\d+\.[ \t]/gm,i=r.disableForced4SpacesIndentedSublists?/^ ?[*+-][ \t]/gm:/^ {0,3}[*+-][ \t]/gm,l="ul"===t?o:i,c="";if(-1!==e.search(l))!function r(u){var d=u.search(l),p=s(e,t);-1!==d?(c+="\n\n<"+t+p+">\n"+n(u.slice(0,d),!!a)+"\n",l="ul"===(t="ul"===t?"ol":"ul")?o:i,r(u.slice(d))):c+="\n\n<"+t+p+">\n"+n(u,!!a)+"\n"}(e);else{var u=s(e,t);c="\n\n<"+t+u+">\n"+n(e,!!a)+"\n"}return c}return e=t.converter._dispatch("lists.before",e,r,t),e+="¨0",e=t.gListLevel?e.replace(/^(( {0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(¨0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm,function(e,r,t){return o(r,t.search(/[*+-]/g)>-1?"ul":"ol",!0)}):e.replace(/(\n\n|^\n?)(( {0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(¨0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm,function(e,r,t,a){return o(t,a.search(/[*+-]/g)>-1?"ul":"ol",!1)}),e=e.replace(/¨0/,""),e=t.converter._dispatch("lists.after",e,r,t)}),a.subParser("metadata",function(e,r,t){"use strict";function a(e){t.metadata.raw=e,(e=(e=e.replace(/&/g,"&").replace(/"/g,""")).replace(/\n {4}/g," ")).replace(/^([\S ]+): +([\s\S]+?)$/gm,function(e,r,a){return t.metadata.parsed[r]=a,""})}return r.metadata?(e=t.converter._dispatch("metadata.before",e,r,t),e=e.replace(/^\s*«««+(\S*?)\n([\s\S]+?)\n»»»+\n/,function(e,r,t){return a(t),"¨M"}),e=e.replace(/^\s*---+(\S*?)\n([\s\S]+?)\n---+\n/,function(e,r,n){return r&&(t.metadata.format=r),a(n),"¨M"}),e=e.replace(/¨M/g,""),e=t.converter._dispatch("metadata.after",e,r,t)):e}),a.subParser("outdent",function(e,r,t){"use strict";return e=t.converter._dispatch("outdent.before",e,r,t),e=e.replace(/^(\t|[ ]{1,4})/gm,"¨0"),e=e.replace(/¨0/g,""),e=t.converter._dispatch("outdent.after",e,r,t)}),a.subParser("paragraphs",function(e,r,t){"use strict";for(var n=(e=(e=(e=t.converter._dispatch("paragraphs.before",e,r,t)).replace(/^\n+/g,"")).replace(/\n+$/g,"")).split(/\n{2,}/g),s=[],o=n.length,i=0;i=0?s.push(l):l.search(/\S/)>=0&&(l=(l=a.subParser("spanGamut")(l,r,t)).replace(/^([ \t]*)/g,"

"),l+="

",s.push(l))}for(o=s.length,i=0;i]*>\s*]*>/.test(u)&&(d=!0)}s[i]=u}return e=s.join("\n"),e=e.replace(/^\n+/g,""),e=e.replace(/\n+$/g,""),t.converter._dispatch("paragraphs.after",e,r,t)}),a.subParser("runExtension",function(e,r,t,a){"use strict";if(e.filter)r=e.filter(r,a.converter,t);else if(e.regex){var n=e.regex;n instanceof RegExp||(n=new RegExp(n,"g")),r=r.replace(n,e.replace)}return r}),a.subParser("spanGamut",function(e,r,t){"use strict";return e=t.converter._dispatch("spanGamut.before",e,r,t),e=a.subParser("codeSpans")(e,r,t),e=a.subParser("escapeSpecialCharsWithinTagAttributes")(e,r,t),e=a.subParser("encodeBackslashEscapes")(e,r,t),e=a.subParser("images")(e,r,t),e=a.subParser("anchors")(e,r,t),e=a.subParser("autoLinks")(e,r,t),e=a.subParser("simplifiedAutoLinks")(e,r,t),e=a.subParser("emoji")(e,r,t),e=a.subParser("underline")(e,r,t),e=a.subParser("italicsAndBold")(e,r,t),e=a.subParser("strikethrough")(e,r,t),e=a.subParser("ellipsis")(e,r,t),e=a.subParser("hashHTMLSpans")(e,r,t),e=a.subParser("encodeAmpsAndAngles")(e,r,t),r.simpleLineBreaks?/\n\n¨K/.test(e)||(e=e.replace(/\n+/g,"
\n")):e=e.replace(/ +\n/g,"
\n"),e=t.converter._dispatch("spanGamut.after",e,r,t)}),a.subParser("strikethrough",function(e,r,t){"use strict";return r.strikethrough&&(e=(e=t.converter._dispatch("strikethrough.before",e,r,t)).replace(/(?:~){2}([\s\S]+?)(?:~){2}/g,function(e,n){return function(e){return r.simplifiedAutoLink&&(e=a.subParser("simplifiedAutoLinks")(e,r,t)),""+e+""}(n)}),e=t.converter._dispatch("strikethrough.after",e,r,t)),e}),a.subParser("stripLinkDefinitions",function(e,r,t){"use strict";var n=function(e,n,s,o,i,l,c){return n=n.toLowerCase(),s.match(/^data:.+?\/.+?;base64,/)?t.gUrls[n]=s.replace(/\s/g,""):t.gUrls[n]=a.subParser("encodeAmpsAndAngles")(s,r,t),l?l+c:(c&&(t.gTitles[n]=c.replace(/"|'/g,""")),r.parseImgDimensions&&o&&i&&(t.gDimensions[n]={width:o,height:i}),"")};return e=(e+="¨0").replace(/^ {0,3}\[(.+)]:[ \t]*\n?[ \t]*?(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*\n?[ \t]*(?:(\n*)["|'(](.+?)["|')][ \t]*)?(?:\n\n|(?=¨0)|(?=\n\[))/gm,n),e=e.replace(/^ {0,3}\[(.+)]:[ \t]*\n?[ \t]*\s]+)>?(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*\n?[ \t]*(?:(\n*)["|'(](.+?)["|')][ \t]*)?(?:\n+|(?=¨0))/gm,n),e=e.replace(/¨0/,"")}),a.subParser("tables",function(e,r,t){"use strict";function n(e){return/^:[ \t]*--*$/.test(e)?' style="text-align:left;"':/^--*[ \t]*:[ \t]*$/.test(e)?' style="text-align:right;"':/^:[ \t]*--*[ \t]*:$/.test(e)?' style="text-align:center;"':""}function s(e,n){var s="";return e=e.trim(),(r.tablesHeaderId||r.tableHeaderId)&&(s=' id="'+e.replace(/ /g,"_").toLowerCase()+'"'),e=a.subParser("spanGamut")(e,r,t),""+e+"\n"}function o(e,n){return""+a.subParser("spanGamut")(e,r,t)+"\n"}function i(e){var i,l=e.split("\n");for(i=0;i\n\n\n",n=0;n\n";for(var s=0;s\n"}return t+="\n\n"}(p,_)}if(!r.tables)return e;return e=t.converter._dispatch("tables.before",e,r,t),e=e.replace(/\\(\|)/g,a.helper.escapeCharactersCallback),e=e.replace(/^ {0,3}\|?.+\|.+\n {0,3}\|?[ \t]*:?[ \t]*(?:[-=]){2,}[ \t]*:?[ \t]*\|[ \t]*:?[ \t]*(?:[-=]){2,}[\s\S]+?(?:\n\n|¨0)/gm,i),e=e.replace(/^ {0,3}\|.+\|[ \t]*\n {0,3}\|[ \t]*:?[ \t]*(?:[-=]){2,}[ \t]*:?[ \t]*\|[ \t]*\n( {0,3}\|.+\|[ \t]*\n)*(?:\n|¨0)/gm,i),e=t.converter._dispatch("tables.after",e,r,t)}),a.subParser("underline",function(e,r,t){"use strict";return r.underline?(e=t.converter._dispatch("underline.before",e,r,t),e=r.literalMidWordUnderscores?(e=e.replace(/\b___(\S[\s\S]*?)___\b/g,function(e,r){return""+r+""})).replace(/\b__(\S[\s\S]*?)__\b/g,function(e,r){return""+r+""}):(e=e.replace(/___(\S[\s\S]*?)___/g,function(e,r){return/\S$/.test(r)?""+r+"":e})).replace(/__(\S[\s\S]*?)__/g,function(e,r){return/\S$/.test(r)?""+r+"":e}),e=e.replace(/(_)/g,a.helper.escapeCharactersCallback),e=t.converter._dispatch("underline.after",e,r,t)):e}),a.subParser("unescapeSpecialChars",function(e,r,t){"use strict";return e=t.converter._dispatch("unescapeSpecialChars.before",e,r,t),e=e.replace(/¨E(\d+)E/g,function(e,r){var t=parseInt(r);return String.fromCharCode(t)}),e=t.converter._dispatch("unescapeSpecialChars.after",e,r,t)}),a.subParser("makeMarkdown.blockquote",function(e,r){"use strict";var t="";if(e.hasChildNodes())for(var n=e.childNodes,s=n.length,o=0;o "+t.split("\n").join("\n> ")}),a.subParser("makeMarkdown.codeBlock",function(e,r){"use strict";var t=e.getAttribute("language"),a=e.getAttribute("precodenum");return"```"+t+"\n"+r.preList[a]+"\n```"}),a.subParser("makeMarkdown.codeSpan",function(e){"use strict";return"`"+e.innerHTML+"`"}),a.subParser("makeMarkdown.emphasis",function(e,r){"use strict";var t="";if(e.hasChildNodes()){t+="*";for(var n=e.childNodes,s=n.length,o=0;o",e.hasAttribute("width")&&e.hasAttribute("height")&&(r+=" ="+e.getAttribute("width")+"x"+e.getAttribute("height")),e.hasAttribute("title")&&(r+=' "'+e.getAttribute("title")+'"'),r+=")"),r}),a.subParser("makeMarkdown.links",function(e,r){"use strict";var t="";if(e.hasChildNodes()&&e.hasAttribute("href")){var n=e.childNodes,s=n.length;t="[";for(var o=0;o",e.hasAttribute("title")&&(t+=' "'+e.getAttribute("title")+'"'),t+=")"}return t}),a.subParser("makeMarkdown.list",function(e,r,t){"use strict";var n="";if(!e.hasChildNodes())return"";for(var s=e.childNodes,o=s.length,i=e.getAttribute("start")||1,l=0;l"+r.preList[t]+""}),a.subParser("makeMarkdown.strikethrough",function(e,r){"use strict";var t="";if(e.hasChildNodes()){t+="~~";for(var n=e.childNodes,s=n.length,o=0;otr>th"),l=e.querySelectorAll("tbody>tr");for(t=0;t_&&(_=g)}for(t=0;t/g,"\\$1>"),r=r.replace(/^#/gm,"\\#"),r=r.replace(/^(\s*)([-=]{3,})(\s*)$/,"$1\\$2$3"),r=r.replace(/^( {0,3}\d+)\./gm,"$1\\."),r=r.replace(/^( {0,3})([+-])/gm,"$1\\$2"),r=r.replace(/]([\s]*)\(/g,"\\]$1\\("),r=r.replace(/^ {0,3}\[([\S \t]*?)]:/gm,"\\[$1]:")});"function"==typeof define&&define.amd?define(function(){"use strict";return a}):"undefined"!=typeof module&&module.exports?module.exports=a:this.showdown=a}).call(this); diff --git a/js/types.jsonld b/js/types.jsonld new file mode 100644 index 00000000..005b68b1 --- /dev/null +++ b/js/types.jsonld @@ -0,0 +1,124 @@ +{ + "@context": { + "so": "https://schema.org/", + "dp": "http://dbpedia.org/resource/", + "pb": "?jsonld=types#" + }, + "Base64": { + "@type": "so:Text" + }, + "CipherText": { + "@type": "pb:Base64" + }, + "PasteCipherMessage": { + "paste": { + "@type": "so:Text" + }, + "attachment": { + "@type": "so:MediaObject" + }, + "attachment_name": { + "@type": "so:Text" + } + }, + "CommentCipherMessage": { + "comment": { + "@type": "so:Text" + }, + "nickname": { + "@type": "so:Text" + } + }, + "InitializationVector": { + "@type": "pb:Base64" + }, + "Salt": { + "@type": "pb:Base64" + }, + "Iterations": { + "@type": "so:Integer", + "@minimum": 1 + }, + "KeySize": { + "@type": "so:Integer", + "@value": 256, + "@minimum": 128, + "@maximum": 256, + "@enum": [128, 196, 256] + }, + "TagSize": { + "@type": "so:Integer", + "@value": 128, + "@minimum": 32, + "@maximum": 128, + "@enum": [32, 64, 96, 104, 112, 120, 128] + }, + "Algorithm": { + "@type": "so:Text", + "@value": "aes" + }, + "Mode": { + "@type": "so:Text", + "@value": "gcm", + "@enum": ["ctr", "cbc", "gcm"] + }, + "Compression": { + "@type": "so:Text", + "@value": "zlib", + "@enum": ["zlib", "none"] + }, + "Formatter": { + "@type": "so:Text", + "@value": "plaintext", + "@enum": ["plaintext", "syntaxhighlighting", "markdown"] + }, + "Expiration": { + "@type": "so:Text", + "@value": "1week", + "@enum": ["5min", "10min", "1hour", "1day", "1week", "1month", "1year", "never"] + }, + "OpenDiscussion": { + "@type": "so:Boolean", + "@enum": [false, true] + }, + "BurnAfterReading": { + "@type": "so:Boolean", + "@enum": [false, true] + }, + "CreationTime": { + "@type": "dp:Unix_time" + }, + "RemainingSeconds": { + "@type": "dp:Second", + "@minimum": 1 + }, + "CipherParameters": { + "@container": "@list", + "@value": [ + { + "@type": "pb:InitializationVector" + }, + { + "@type": "pb:Salt" + }, + { + "@type": "pb:Iterations" + }, + { + "@type": "pb:KeySize" + }, + { + "@type": "pb:TagSize" + }, + { + "@type": "pb:Algorithm" + }, + { + "@type": "pb:Mode" + }, + { + "@type": "pb:Compression" + } + ] + } +} \ No newline at end of file diff --git a/js/zlib-1.2.11.js b/js/zlib-1.2.11.js new file mode 100644 index 00000000..ed0abea8 --- /dev/null +++ b/js/zlib-1.2.11.js @@ -0,0 +1,146 @@ +'use strict'; + +(function() { + let ret; + + async function initialize() { + if (ret) return ret; + + const COMPRESSION_LEVEL = 7; + const NO_ZLIB_HEADER = -1; + const CHUNK_SIZE = 32 * 1024; + const map = {}; + const memory = new WebAssembly.Memory({ + initial: 1, + maximum: 1024, // 64MB + }); + const env = { + memory, + writeToJs(ptr, size) { + const o = map[ptr]; + o.onData(new Uint8Array(memory.buffer, dstPtr, size)); + }, + _abort: errno => { console.error(`Error: ${errno}`) }, + _grow: () => { }, + }; + + let buff; + if (typeof fetch === 'undefined') { + buff = fs.readFileSync('zlib-1.2.11.wasm'); + } else { + const resp = await fetch('js/zlib-1.2.11.wasm'); + buff = await resp.arrayBuffer(); + } + const module = await WebAssembly.compile(buff); + const ins = await WebAssembly.instantiate(module, { env }); + + const srcPtr = ins.exports._malloc(CHUNK_SIZE); + const dstPtr = ins.exports._malloc(CHUNK_SIZE); + + class RawDef { + constructor() { + this.zstreamPtr = ins.exports._createDeflateContext(COMPRESSION_LEVEL, NO_ZLIB_HEADER); + map[this.zstreamPtr] = this; + this.offset = 0; + this.buff = new Uint8Array(CHUNK_SIZE); + } + + deflate(chunk, flush) { + const src = new Uint8Array(memory.buffer, srcPtr, chunk.length); + src.set(chunk); + ins.exports._deflate(this.zstreamPtr, srcPtr, dstPtr, chunk.length, CHUNK_SIZE, flush); + } + + onData(chunk) { + if (this.buff.length < this.offset + chunk.length) { + const buff = this.buff; + this.buff = new Uint8Array(this.buff.length * 2); + this.buff.set(buff); + } + this.buff.set(chunk, this.offset); + this.offset += chunk.length; + } + + destroy() { + ins.exports._freeDeflateContext(this.zstreamPtr); + delete map[this.zstreamPtr]; + this.buff = null; + } + + getBuffer() { + const res = new Uint8Array(this.offset); + for (let i = 0; i < this.offset; ++i) { + res[i] = this.buff[i]; + } + return res; + } + } + + class RawInf { + constructor() { + this.zstreamPtr = ins.exports._createInflateContext(NO_ZLIB_HEADER); + map[this.zstreamPtr] = this; + this.offset = 0; + this.buff = new Uint8Array(CHUNK_SIZE); + } + + inflate(chunk) { + const src = new Uint8Array(memory.buffer, srcPtr, chunk.length); + src.set(chunk); + ins.exports._inflate(this.zstreamPtr, srcPtr, dstPtr, chunk.length, CHUNK_SIZE); + } + + onData(chunk) { + if (this.buff.length < this.offset + chunk.length) { + const buff = this.buff; + this.buff = new Uint8Array(this.buff.length * 2); + this.buff.set(buff); + } + this.buff.set(chunk, this.offset); + this.offset += chunk.length; + } + + destroy() { + ins.exports._freeInflateContext(this.zstreamPtr); + delete map[this.zstreamPtr]; + this.buff = null; + } + + getBuffer() { + const res = new Uint8Array(this.offset); + for (let i = 0; i < this.offset; ++i) { + res[i] = this.buff[i]; + } + return res; + } + } + + ret = { + inflate(rawDeflateBuffer) { + const rawInf = new RawInf(); + for (let offset = 0; offset < rawDeflateBuffer.length; offset += CHUNK_SIZE) { + const end = Math.min(offset + CHUNK_SIZE, rawDeflateBuffer.length); + const chunk = rawDeflateBuffer.subarray(offset, end); + rawInf.inflate(chunk); + } + const ret = rawInf.getBuffer(); + rawInf.destroy(); + return ret; + }, + deflate(rawInflateBuffer) { + const rawDef = new RawDef(); + for (let offset = 0; offset < rawInflateBuffer.length; offset += CHUNK_SIZE) { + const end = Math.min(offset + CHUNK_SIZE, rawInflateBuffer.length); + const chunk = rawInflateBuffer.subarray(offset, end); + rawDef.deflate(chunk, rawInflateBuffer.length <= offset + CHUNK_SIZE); + } + const ret = rawDef.getBuffer(); + rawDef.destroy(); + return ret; + }, + } + + return ret; + } + this.zlib = initialize(); +}).call(this); diff --git a/js/zlib-1.2.11.wasm b/js/zlib-1.2.11.wasm new file mode 100644 index 0000000000000000000000000000000000000000..d98ea382eaee10be7c971f914b704f9bd455b79a GIT binary patch literal 61388 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 array( + 'name' => 'PrivateBin', + 'discussion' => true, + 'opendiscussion' => false, + 'password' => true, + 'fileupload' => false, + 'burnafterreadingselected' => false, + 'defaultformatter' => 'plaintext', + 'syntaxhighlightingtheme' => null, + 'sizelimit' => 10485760, + 'template' => 'bootstrap', + 'notice' => '', + 'languageselection' => false, + 'languagedefault' => '', + 'urlshortener' => '', + 'qrcode' => true, + 'icon' => 'identicon', + 'cspheader' => 'default-src \'none\'; manifest-src \'self\'; connect-src * blob:; script-src \'self\' \'unsafe-eval\'; style-src \'self\'; font-src \'self\'; img-src \'self\' data: blob:; media-src blob:; object-src blob:; sandbox allow-same-origin allow-scripts allow-forms allow-popups allow-modals', + 'zerobincompatibility' => false, + 'httpwarning' => true, + 'compression' => 'zlib', + ), + 'expire' => array( + 'default' => '1week', + ), + 'expire_options' => array( + '5min' => 300, + '10min' => 600, + '1hour' => 3600, + '1day' => 86400, + '1week' => 604800, + '1month' => 2592000, + '1year' => 31536000, + 'never' => 0, + ), + 'formatter_options' => array( + 'plaintext' => 'Plain Text', + 'syntaxhighlighting' => 'Source Code', + 'markdown' => 'Markdown', + ), + 'traffic' => array( + 'limit' => 10, + 'header' => null, + 'dir' => 'data', + ), + 'purge' => array( + 'limit' => 300, + 'batchsize' => 10, + 'dir' => 'data', + ), + 'model' => array( + 'class' => 'Filesystem', + ), + 'model_options' => array( + 'dir' => 'data', + ), + ); + + /** + * parse configuration file and ensure default configuration values are present + * + * @throws Exception + */ + public function __construct() + { + $config = array(); + $basePath = (getenv('CONFIG_PATH') !== false ? getenv('CONFIG_PATH') : PATH . 'cfg') . DIRECTORY_SEPARATOR; + $configIni = $basePath . 'conf.ini'; + $configFile = $basePath . 'conf.php'; + + // rename INI files to avoid configuration leakage + if (is_readable($configIni)) { + DataStore::prependRename($configIni, $configFile, ';'); + + // cleanup sample, too + $configIniSample = $configIni . '.sample'; + if (is_readable($configIniSample)) { + DataStore::prependRename($configIniSample, $basePath . 'conf.sample.php', ';'); + } + } + + if (is_readable($configFile)) { + $config = parse_ini_file($configFile, true); + foreach (array('main', 'model', 'model_options') as $section) { + if (!array_key_exists($section, $config)) { + throw new Exception(I18n::_('PrivateBin requires configuration section [%s] to be present in configuration file.', $section), 2); + } + } + } + + $opts = '_options'; + foreach (self::getDefaults() as $section => $values) { + // fill missing sections with default values + if (!array_key_exists($section, $config) || count($config[$section]) == 0) { + $this->_configuration[$section] = $values; + if (array_key_exists('dir', $this->_configuration[$section])) { + $this->_configuration[$section]['dir'] = PATH . $this->_configuration[$section]['dir']; + } + continue; + } + // provide different defaults for database model + elseif ( + $section == 'model_options' && in_array( + $this->_configuration['model']['class'], + array('Database', 'privatebin_db', 'zerobin_db') + ) + ) { + $values = array( + 'dsn' => 'sqlite:' . PATH . 'data' . DIRECTORY_SEPARATOR . 'db.sq3', + 'tbl' => null, + 'usr' => null, + 'pwd' => null, + 'opt' => array(PDO::ATTR_PERSISTENT => true), + ); + } + + // "*_options" sections don't require all defaults to be set + if ( + $section !== 'model_options' && + ($from = strlen($section) - strlen($opts)) >= 0 && + strpos($section, $opts, $from) !== false + ) { + if (is_int(current($values))) { + $config[$section] = array_map('intval', $config[$section]); + } + $this->_configuration[$section] = $config[$section]; + } + // check for missing keys and set defaults if necessary + else { + foreach ($values as $key => $val) { + if ($key == 'dir') { + $val = PATH . $val; + } + $result = $val; + if (array_key_exists($key, $config[$section])) { + if ($val === null) { + $result = $config[$section][$key]; + } elseif (is_bool($val)) { + $val = strtolower($config[$section][$key]); + if (in_array($val, array('true', 'yes', 'on'))) { + $result = true; + } elseif (in_array($val, array('false', 'no', 'off'))) { + $result = false; + } else { + $result = (bool) $config[$section][$key]; + } + } elseif (is_int($val)) { + $result = (int) $config[$section][$key]; + } elseif (is_string($val) && !empty($config[$section][$key])) { + $result = (string) $config[$section][$key]; + } + } + $this->_configuration[$section][$key] = $result; + } + } + } + + // support for old config file format, before the fork was renamed and PSR-4 introduced + $this->_configuration['model']['class'] = str_replace( + 'zerobin_', 'privatebin_', + $this->_configuration['model']['class'] + ); + + $this->_configuration['model']['class'] = str_replace( + array('privatebin_data', 'privatebin_db'), + array('Filesystem', 'Database'), + $this->_configuration['model']['class'] + ); + + // ensure a valid expire default key is set + if (!array_key_exists($this->_configuration['expire']['default'], $this->_configuration['expire_options'])) { + $this->_configuration['expire']['default'] = key($this->_configuration['expire_options']); + } + } + + /** + * get configuration as array + * + * @return array + */ + public function get() + { + return $this->_configuration; + } + + /** + * get default configuration as array + * + * @return array + */ + public static function getDefaults() + { + return self::$_defaults; + } + + /** + * get a key from the configuration, typically the main section or all keys + * + * @param string $key + * @param string $section defaults to main + * @throws Exception + * @return mixed + */ + public function getKey($key, $section = 'main') + { + $options = $this->getSection($section); + if (!array_key_exists($key, $options)) { + throw new Exception(I18n::_('Invalid data.') . " $section / $key", 4); + } + return $this->_configuration[$section][$key]; + } + + /** + * get a section from the configuration, must exist + * + * @param string $section + * @throws Exception + * @return mixed + */ + public function getSection($section) + { + if (!array_key_exists($section, $this->_configuration)) { + throw new Exception(I18n::_('%s requires configuration section [%s] to be present in configuration file.', I18n::_($this->getKey('name')), $section), 3); + } + return $this->_configuration[$section]; + } +} diff --git a/lib/Controller.php b/lib/Controller.php new file mode 100644 index 00000000..18e58522 --- /dev/null +++ b/lib/Controller.php @@ -0,0 +1,446 @@ +_init(); + + switch ($this->_request->getOperation()) { + case 'create': + $this->_create(); + break; + case 'delete': + $this->_delete( + $this->_request->getParam('pasteid'), + $this->_request->getParam('deletetoken') + ); + break; + case 'read': + $this->_read($this->_request->getParam('pasteid')); + break; + case 'jsonld': + $this->_jsonld($this->_request->getParam('jsonld')); + return; + } + + // output JSON or HTML + if ($this->_request->isJsonApiCall()) { + header('Content-type: ' . Request::MIME_JSON); + header('Access-Control-Allow-Origin: *'); + header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE'); + header('Access-Control-Allow-Headers: X-Requested-With, Content-Type'); + echo $this->_json; + } else { + $this->_view(); + } + } + + /** + * initialize PrivateBin + * + * @access private + * @throws Exception + */ + private function _init() + { + $this->_conf = new Configuration; + $this->_model = new Model($this->_conf); + $this->_request = new Request; + $this->_urlBase = $this->_request->getRequestUri(); + ServerSalt::setPath($this->_conf->getKey('dir', 'traffic')); + + // set default language + $lang = $this->_conf->getKey('languagedefault'); + I18n::setLanguageFallback($lang); + // force default language, if language selection is disabled and a default is set + if (!$this->_conf->getKey('languageselection') && strlen($lang) == 2) { + $_COOKIE['lang'] = $lang; + setcookie('lang', $lang); + } + } + + /** + * Store new paste or comment + * + * POST contains one or both: + * data = json encoded FormatV2 encrypted text (containing keys: iv,v,iter,ks,ts,mode,adata,cipher,salt,ct) + * attachment = json encoded FormatV2 encrypted text (containing keys: iv,v,iter,ks,ts,mode,adata,cipher,salt,ct) + * + * All optional data will go to meta information: + * expire (optional) = expiration delay (never,5min,10min,1hour,1day,1week,1month,1year,burn) (default:never) + * formatter (optional) = format to display the paste as (plaintext,syntaxhighlighting,markdown) (default:syntaxhighlighting) + * burnafterreading (optional) = if this paste may only viewed once ? (0/1) (default:0) + * opendiscusssion (optional) = is the discussion allowed on this paste ? (0/1) (default:0) + * attachmentname = json encoded FormatV2 encrypted text (containing keys: iv,v,iter,ks,ts,mode,adata,cipher,salt,ct) + * nickname (optional) = in discussion, encoded FormatV2 encrypted text nickname of author of comment (containing keys: iv,v,iter,ks,ts,mode,adata,cipher,salt,ct) + * parentid (optional) = in discussion, which comment this comment replies to. + * pasteid (optional) = in discussion, which paste this comment belongs to. + * + * @access private + * @return string + */ + private function _create() + { + // Ensure last paste from visitors IP address was more than configured amount of seconds ago. + TrafficLimiter::setConfiguration($this->_conf); + if (!TrafficLimiter::canPass()) { + $this->_return_message( + 1, I18n::_( + 'Please wait %d seconds between each post.', + $this->_conf->getKey('limit', 'traffic') + ) + ); + return; + } + + $data = $this->_request->getData(); + $isComment = array_key_exists('pasteid', $data) && + !empty($data['pasteid']) && + array_key_exists('parentid', $data) && + !empty($data['parentid']); + if (!FormatV2::isValid($data, $isComment)) { + $this->_return_message(1, I18n::_('Invalid data.')); + return; + } + $sizelimit = $this->_conf->getKey('sizelimit'); + // Ensure content is not too big. + if (strlen($data['ct']) > $sizelimit) { + $this->_return_message( + 1, + I18n::_( + 'Paste is limited to %s of encrypted data.', + Filter::formatHumanReadableSize($sizelimit) + ) + ); + return; + } + + // The user posts a comment. + if ($isComment) { + $paste = $this->_model->getPaste($data['pasteid']); + if ($paste->exists()) { + try { + $comment = $paste->getComment($data['parentid']); + $comment->setData($data); + $comment->store(); + } catch (Exception $e) { + $this->_return_message(1, $e->getMessage()); + return; + } + $this->_return_message(0, $comment->getId()); + } else { + $this->_return_message(1, I18n::_('Invalid data.')); + } + } + // The user posts a standard paste. + else { + $this->_model->purge(); + $paste = $this->_model->getPaste(); + try { + $paste->setData($data); + $paste->store(); + } catch (Exception $e) { + return $this->_return_message(1, $e->getMessage()); + } + $this->_return_message(0, $paste->getId(), array('deletetoken' => $paste->getDeleteToken())); + } + } + + /** + * Delete an existing paste + * + * @access private + * @param string $dataid + * @param string $deletetoken + */ + private function _delete($dataid, $deletetoken) + { + try { + $paste = $this->_model->getPaste($dataid); + if ($paste->exists()) { + // accessing this method ensures that the paste would be + // deleted if it has already expired + $paste->get(); + if ( + Filter::slowEquals($deletetoken, $paste->getDeleteToken()) + ) { + // Paste exists and deletion token is valid: Delete the paste. + $paste->delete(); + $this->_status = 'Paste was properly deleted.'; + } else { + $this->_error = 'Wrong deletion token. Paste was not deleted.'; + } + } else { + $this->_error = self::GENERIC_ERROR; + } + } catch (Exception $e) { + $this->_error = $e->getMessage(); + } + if ($this->_request->isJsonApiCall()) { + if (strlen($this->_error)) { + $this->_return_message(1, $this->_error); + } else { + $this->_return_message(0, $dataid); + } + } + } + + /** + * Read an existing paste or comment, only allowed via a JSON API call + * + * @access private + * @param string $dataid + */ + private function _read($dataid) + { + if (!$this->_request->isJsonApiCall()) { + return; + } + + try { + $paste = $this->_model->getPaste($dataid); + if ($paste->exists()) { + $data = $paste->get(); + if (array_key_exists('salt', $data['meta'])) { + unset($data['meta']['salt']); + } + $this->_return_message(0, $dataid, (array) $data); + } else { + $this->_return_message(1, self::GENERIC_ERROR); + } + } catch (Exception $e) { + $this->_return_message(1, $e->getMessage()); + } + } + + /** + * Display frontend. + * + * @access private + */ + private function _view() + { + // set headers to disable caching + $time = gmdate('D, d M Y H:i:s \G\M\T'); + header('Cache-Control: no-store, no-cache, no-transform, must-revalidate'); + header('Pragma: no-cache'); + header('Expires: ' . $time); + header('Last-Modified: ' . $time); + header('Vary: Accept'); + header('Content-Security-Policy: ' . $this->_conf->getKey('cspheader')); + header('Referrer-Policy: no-referrer'); + header('X-Xss-Protection: 1; mode=block'); + header('X-Frame-Options: DENY'); + header('X-Content-Type-Options: nosniff'); + + // label all the expiration options + $expire = array(); + foreach ($this->_conf->getSection('expire_options') as $time => $seconds) { + $expire[$time] = ($seconds == 0) ? I18n::_(ucfirst($time)) : Filter::formatHumanReadableTime($time); + } + + // translate all the formatter options + $formatters = array_map('PrivateBin\\I18n::_', $this->_conf->getSection('formatter_options')); + + // set language cookie if that functionality was enabled + $languageselection = ''; + if ($this->_conf->getKey('languageselection')) { + $languageselection = I18n::getLanguage(); + setcookie('lang', $languageselection); + } + + $page = new View; + $page->assign('NAME', $this->_conf->getKey('name')); + $page->assign('ERROR', I18n::_($this->_error)); + $page->assign('STATUS', I18n::_($this->_status)); + $page->assign('VERSION', self::VERSION); + $page->assign('DISCUSSION', $this->_conf->getKey('discussion')); + $page->assign('OPENDISCUSSION', $this->_conf->getKey('opendiscussion')); + $page->assign('MARKDOWN', array_key_exists('markdown', $formatters)); + $page->assign('SYNTAXHIGHLIGHTING', array_key_exists('syntaxhighlighting', $formatters)); + $page->assign('SYNTAXHIGHLIGHTINGTHEME', $this->_conf->getKey('syntaxhighlightingtheme')); + $page->assign('FORMATTER', $formatters); + $page->assign('FORMATTERDEFAULT', $this->_conf->getKey('defaultformatter')); + $page->assign('NOTICE', I18n::_($this->_conf->getKey('notice'))); + $page->assign('BURNAFTERREADINGSELECTED', $this->_conf->getKey('burnafterreadingselected')); + $page->assign('PASSWORD', $this->_conf->getKey('password')); + $page->assign('FILEUPLOAD', $this->_conf->getKey('fileupload')); + $page->assign('ZEROBINCOMPATIBILITY', $this->_conf->getKey('zerobincompatibility')); + $page->assign('LANGUAGESELECTION', $languageselection); + $page->assign('LANGUAGES', I18n::getLanguageLabels(I18n::getAvailableLanguages())); + $page->assign('EXPIRE', $expire); + $page->assign('EXPIREDEFAULT', $this->_conf->getKey('default', 'expire')); + $page->assign('URLSHORTENER', $this->_conf->getKey('urlshortener')); + $page->assign('QRCODE', $this->_conf->getKey('qrcode')); + $page->assign('HTTPWARNING', $this->_conf->getKey('httpwarning')); + $page->assign('HTTPSLINK', 'https://' . $this->_request->getHost() . $this->_request->getRequestUri()); + $page->assign('COMPRESSION', $this->_conf->getKey('compression')); + $page->draw($this->_conf->getKey('template')); + } + + /** + * outputs requested JSON-LD context + * + * @access private + * @param string $type + */ + private function _jsonld($type) + { + if ( + $type !== 'paste' && $type !== 'comment' && + $type !== 'pastemeta' && $type !== 'commentmeta' + ) { + $type = ''; + } + $content = '{}'; + $file = PUBLIC_PATH . DIRECTORY_SEPARATOR . 'js' . DIRECTORY_SEPARATOR . $type . '.jsonld'; + if (is_readable($file)) { + $content = str_replace( + '?jsonld=', + $this->_urlBase . '?jsonld=', + file_get_contents($file) + ); + } + + header('Content-type: application/ld+json'); + header('Access-Control-Allow-Origin: *'); + header('Access-Control-Allow-Methods: GET'); + echo $content; + } + + /** + * prepares JSON encoded status message + * + * @access private + * @param int $status + * @param string $message + * @param array $other + */ + private function _return_message($status, $message, $other = array()) + { + $result = array('status' => $status); + if ($status) { + $result['message'] = I18n::_($message); + } else { + $result['id'] = $message; + $result['url'] = $this->_urlBase . '?' . $message; + } + $result += $other; + $this->_json = Json::encode($result); + } +} diff --git a/lib/Data/AbstractData.php b/lib/Data/AbstractData.php new file mode 100644 index 00000000..85325f04 --- /dev/null +++ b/lib/Data/AbstractData.php @@ -0,0 +1,202 @@ +_getExpiredPastes($batchsize); + if (count($pastes)) { + foreach ($pastes as $pasteid) { + $this->delete($pasteid); + } + } + } + + /** + * Get next free slot for comment from postdate. + * + * @access protected + * @param array $comments + * @param int|string $postdate + * @return int|string + */ + protected function getOpenSlot(array &$comments, $postdate) + { + if (array_key_exists($postdate, $comments)) { + $parts = explode('.', $postdate, 2); + if (!array_key_exists(1, $parts)) { + $parts[1] = 0; + } + ++$parts[1]; + return $this->getOpenSlot($comments, implode('.', $parts)); + } + return $postdate; + } + + /** + * Upgrade pre-version 1 pastes with attachment to version 1 format. + * + * @access protected + * @static + * @param array $paste + * @return array + */ + protected static function upgradePreV1Format(array $paste) + { + if (array_key_exists('attachment', $paste['meta'])) { + $paste['attachment'] = $paste['meta']['attachment']; + unset($paste['meta']['attachment']); + if (array_key_exists('attachmentname', $paste['meta'])) { + $paste['attachmentname'] = $paste['meta']['attachmentname']; + unset($paste['meta']['attachmentname']); + } + } + return $paste; + } +} diff --git a/lib/Data/Database.php b/lib/Data/Database.php new file mode 100644 index 00000000..9e18acd4 --- /dev/null +++ b/lib/Data/Database.php @@ -0,0 +1,782 @@ +query($tableQuery)->fetchAll(PDO::FETCH_COLUMN, 0); + + // create paste table if necessary + if (!in_array(self::_sanitizeIdentifier('paste'), $tables)) { + self::_createPasteTable(); + $db_tables_exist = false; + } + + // create comment table if necessary + if (!in_array(self::_sanitizeIdentifier('comment'), $tables)) { + self::_createCommentTable(); + $db_tables_exist = false; + } + + // create config table if necessary + $db_version = Controller::VERSION; + if (!in_array(self::_sanitizeIdentifier('config'), $tables)) { + self::_createConfigTable(); + // if we only needed to create the config table, the DB is older then 0.22 + if ($db_tables_exist) { + $db_version = '0.21'; + } + } else { + $db_version = self::_getConfig('VERSION'); + } + + // update database structure if necessary + if (version_compare($db_version, Controller::VERSION, '<')) { + self::_upgradeDatabase($db_version); + } + } else { + throw new Exception( + 'Missing configuration for key dsn, usr, pwd or opt in the section model_options, please check your configuration file', 6 + ); + } + + return self::$_instance; + } + + /** + * Create a paste. + * + * @access public + * @param string $pasteid + * @param array $paste + * @return bool + */ + public function create($pasteid, array $paste) + { + if ( + array_key_exists($pasteid, self::$_cache) + ) { + if (false !== self::$_cache[$pasteid]) { + return false; + } else { + unset(self::$_cache[$pasteid]); + } + } + + $expire_date = 0; + $opendiscussion = $burnafterreading = false; + $attachment = $attachmentname = null; + $meta = $paste['meta']; + $isVersion1 = array_key_exists('data', $paste); + list($createdKey) = self::_getVersionedKeys($isVersion1 ? 1 : 2); + $created = (int) $meta[$createdKey]; + unset($meta[$createdKey], $paste['meta']); + if (array_key_exists('expire_date', $meta)) { + $expire_date = (int) $meta['expire_date']; + unset($meta['expire_date']); + } + if (array_key_exists('opendiscussion', $meta)) { + $opendiscussion = $meta['opendiscussion']; + unset($meta['opendiscussion']); + } + if (array_key_exists('burnafterreading', $meta)) { + $burnafterreading = $meta['burnafterreading']; + unset($meta['burnafterreading']); + } + if ($isVersion1) { + if (array_key_exists('attachment', $meta)) { + $attachment = $meta['attachment']; + unset($meta['attachment']); + } + if (array_key_exists('attachmentname', $meta)) { + $attachmentname = $meta['attachmentname']; + unset($meta['attachmentname']); + } + } else { + $opendiscussion = $paste['adata'][2]; + $burnafterreading = $paste['adata'][3]; + } + return self::_exec( + 'INSERT INTO ' . self::_sanitizeIdentifier('paste') . + ' VALUES(?,?,?,?,?,?,?,?,?)', + array( + $pasteid, + $isVersion1 ? $paste['data'] : Json::encode($paste), + $created, + $expire_date, + (int) $opendiscussion, + (int) $burnafterreading, + Json::encode($meta), + $attachment, + $attachmentname, + ) + ); + } + + /** + * Read a paste. + * + * @access public + * @param string $pasteid + * @return array|false + */ + public function read($pasteid) + { + if (array_key_exists($pasteid, self::$_cache)) { + return self::$_cache[$pasteid]; + } + + self::$_cache[$pasteid] = false; + $paste = self::_select( + 'SELECT * FROM ' . self::_sanitizeIdentifier('paste') . + ' WHERE dataid = ?', array($pasteid), true + ); + + if ($paste === false) { + return false; + } + // create array + $data = Json::decode($paste['data']); + $isVersion2 = array_key_exists('v', $data) && $data['v'] >= 2; + if ($isVersion2) { + self::$_cache[$pasteid] = $data; + list($createdKey) = self::_getVersionedKeys(2); + } else { + self::$_cache[$pasteid] = array('data' => $paste['data']); + list($createdKey) = self::_getVersionedKeys(1); + } + + try { + $paste['meta'] = Json::decode($paste['meta']); + } catch (Exception $e) { + $paste['meta'] = array(); + } + $paste = self::upgradePreV1Format($paste); + self::$_cache[$pasteid]['meta'] = $paste['meta']; + self::$_cache[$pasteid]['meta'][$createdKey] = (int) $paste['postdate']; + $expire_date = (int) $paste['expiredate']; + if ($expire_date > 0) { + self::$_cache[$pasteid]['meta']['expire_date'] = $expire_date; + } + if ($isVersion2) { + return self::$_cache[$pasteid]; + } + + // support v1 attachments + if (array_key_exists('attachment', $paste) && strlen($paste['attachment'])) { + self::$_cache[$pasteid]['attachment'] = $paste['attachment']; + if (array_key_exists('attachmentname', $paste) && strlen($paste['attachmentname'])) { + self::$_cache[$pasteid]['attachmentname'] = $paste['attachmentname']; + } + } + if ($paste['opendiscussion']) { + self::$_cache[$pasteid]['meta']['opendiscussion'] = true; + } + if ($paste['burnafterreading']) { + self::$_cache[$pasteid]['meta']['burnafterreading'] = true; + } + + return self::$_cache[$pasteid]; + } + + /** + * Delete a paste and its discussion. + * + * @access public + * @param string $pasteid + */ + public function delete($pasteid) + { + self::_exec( + 'DELETE FROM ' . self::_sanitizeIdentifier('paste') . + ' WHERE dataid = ?', array($pasteid) + ); + self::_exec( + 'DELETE FROM ' . self::_sanitizeIdentifier('comment') . + ' WHERE pasteid = ?', array($pasteid) + ); + if ( + array_key_exists($pasteid, self::$_cache) + ) { + unset(self::$_cache[$pasteid]); + } + } + + /** + * Test if a paste exists. + * + * @access public + * @param string $pasteid + * @return bool + */ + public function exists($pasteid) + { + if ( + !array_key_exists($pasteid, self::$_cache) + ) { + self::$_cache[$pasteid] = $this->read($pasteid); + } + return (bool) self::$_cache[$pasteid]; + } + + /** + * Create a comment in a paste. + * + * @access public + * @param string $pasteid + * @param string $parentid + * @param string $commentid + * @param array $comment + * @return bool + */ + public function createComment($pasteid, $parentid, $commentid, array $comment) + { + if (array_key_exists('data', $comment)) { + $version = 1; + $data = $comment['data']; + } else { + $version = 2; + $data = Json::encode($comment); + } + list($createdKey, $iconKey) = self::_getVersionedKeys($version); + $meta = $comment['meta']; + unset($comment['meta']); + foreach (array('nickname', $iconKey) as $key) { + if (!array_key_exists($key, $meta)) { + $meta[$key] = null; + } + } + return self::_exec( + 'INSERT INTO ' . self::_sanitizeIdentifier('comment') . + ' VALUES(?,?,?,?,?,?,?)', + array( + $commentid, + $pasteid, + $parentid, + $data, + $meta['nickname'], + $meta[$iconKey], + $meta[$createdKey], + ) + ); + } + + /** + * Read all comments of paste. + * + * @access public + * @param string $pasteid + * @return array + */ + public function readComments($pasteid) + { + $rows = self::_select( + 'SELECT * FROM ' . self::_sanitizeIdentifier('comment') . + ' WHERE pasteid = ?', array($pasteid) + ); + + // create comment list + $comments = array(); + if (count($rows)) { + foreach ($rows as $row) { + $i = $this->getOpenSlot($comments, (int) $row['postdate']); + $data = Json::decode($row['data']); + if (array_key_exists('v', $data) && $data['v'] >= 2) { + $version = 2; + $comments[$i] = $data; + } else { + $version = 1; + $comments[$i] = array('data' => $row['data']); + } + list($createdKey, $iconKey) = self::_getVersionedKeys($version); + $comments[$i]['id'] = $row['dataid']; + $comments[$i]['parentid'] = $row['parentid']; + $comments[$i]['meta'] = array($createdKey => (int) $row['postdate']); + foreach (array('nickname' => 'nickname', 'vizhash' => $iconKey) as $rowKey => $commentKey) { + if (array_key_exists($rowKey, $row) && !empty($row[$rowKey])) { + $comments[$i]['meta'][$commentKey] = $row[$rowKey]; + } + } + } + ksort($comments); + } + return $comments; + } + + /** + * Test if a comment exists. + * + * @access public + * @param string $pasteid + * @param string $parentid + * @param string $commentid + * @return bool + */ + public function existsComment($pasteid, $parentid, $commentid) + { + return (bool) self::_select( + 'SELECT dataid FROM ' . self::_sanitizeIdentifier('comment') . + ' WHERE pasteid = ? AND parentid = ? AND dataid = ?', + array($pasteid, $parentid, $commentid), true + ); + } + + /** + * Returns up to batch size number of paste ids that have expired + * + * @access private + * @param int $batchsize + * @return array + */ + protected function _getExpiredPastes($batchsize) + { + $pastes = array(); + $rows = self::_select( + 'SELECT dataid FROM ' . self::_sanitizeIdentifier('paste') . + ' WHERE expiredate < ? AND expiredate != ? LIMIT ?', + array(time(), 0, $batchsize) + ); + if (count($rows)) { + foreach ($rows as $row) { + $pastes[] = $row['dataid']; + } + } + return $pastes; + } + + /** + * execute a statement + * + * @access private + * @static + * @param string $sql + * @param array $params + * @throws PDOException + * @return bool + */ + private static function _exec($sql, array $params) + { + $statement = self::$_db->prepare($sql); + $result = $statement->execute($params); + $statement->closeCursor(); + return $result; + } + + /** + * run a select statement + * + * @access private + * @static + * @param string $sql + * @param array $params + * @param bool $firstOnly if only the first row should be returned + * @throws PDOException + * @return array|false + */ + private static function _select($sql, array $params, $firstOnly = false) + { + $statement = self::$_db->prepare($sql); + $statement->execute($params); + $result = $firstOnly ? + $statement->fetch(PDO::FETCH_ASSOC) : + $statement->fetchAll(PDO::FETCH_ASSOC); + $statement->closeCursor(); + return $result; + } + + /** + * get version dependent key names + * + * @access private + * @static + * @param int $version + * @return array + */ + private static function _getVersionedKeys($version) + { + if ($version === 1) { + return array('postdate', 'vizhash'); + } + return array('created', 'icon'); + } + + /** + * get table list query, depending on the database type + * + * @access private + * @static + * @param string $type + * @throws Exception + * @return string + */ + private static function _getTableQuery($type) + { + switch ($type) { + case 'ibm': + $sql = 'SELECT tabname FROM SYSCAT.TABLES '; + break; + case 'informix': + $sql = 'SELECT tabname FROM systables '; + break; + case 'mssql': + $sql = 'SELECT name FROM sysobjects ' + . "WHERE type = 'U' ORDER BY name"; + break; + case 'mysql': + $sql = 'SHOW TABLES'; + break; + case 'oci': + $sql = 'SELECT table_name FROM all_tables'; + break; + case 'pgsql': + $sql = 'SELECT c.relname AS table_name ' + . 'FROM pg_class c, pg_user u ' + . "WHERE c.relowner = u.usesysid AND c.relkind = 'r' " + . 'AND NOT EXISTS (SELECT 1 FROM pg_views WHERE viewname = c.relname) ' + . "AND c.relname !~ '^(pg_|sql_)' " + . 'UNION ' + . 'SELECT c.relname AS table_name ' + . 'FROM pg_class c ' + . "WHERE c.relkind = 'r' " + . 'AND NOT EXISTS (SELECT 1 FROM pg_views WHERE viewname = c.relname) ' + . 'AND NOT EXISTS (SELECT 1 FROM pg_user WHERE usesysid = c.relowner) ' + . "AND c.relname !~ '^pg_'"; + break; + case 'sqlite': + $sql = "SELECT name FROM sqlite_master WHERE type='table' " + . 'UNION ALL SELECT name FROM sqlite_temp_master ' + . "WHERE type='table' ORDER BY name"; + break; + default: + throw new Exception( + "PDO type $type is currently not supported.", 5 + ); + } + return $sql; + } + + /** + * get a value by key from the config table + * + * @access private + * @static + * @param string $key + * @throws PDOException + * @return string + */ + private static function _getConfig($key) + { + $row = self::_select( + 'SELECT value FROM ' . self::_sanitizeIdentifier('config') . + ' WHERE id = ?', array($key), true + ); + return $row['value']; + } + + /** + * get the primary key clauses, depending on the database driver + * + * @access private + * @static + * @param string $key + * @return array + */ + private static function _getPrimaryKeyClauses($key = 'dataid') + { + $main_key = $after_key = ''; + if (self::$_type === 'mysql') { + $after_key = ", PRIMARY KEY ($key)"; + } else { + $main_key = ' PRIMARY KEY'; + } + return array($main_key, $after_key); + } + + /** + * get the data type, depending on the database driver + * + * PostgreSQL uses a different API for BLOBs then SQL, hence we use TEXT + * + * @access private + * @static + * @return string + */ + private static function _getDataType() + { + return self::$_type === 'pgsql' ? 'TEXT' : 'BLOB'; + } + + /** + * get the attachment type, depending on the database driver + * + * PostgreSQL uses a different API for BLOBs then SQL, hence we use TEXT + * + * @access private + * @static + * @return string + */ + private static function _getAttachmentType() + { + return self::$_type === 'pgsql' ? 'TEXT' : 'MEDIUMBLOB'; + } + + /** + * create the paste table + * + * @access private + * @static + */ + private static function _createPasteTable() + { + list($main_key, $after_key) = self::_getPrimaryKeyClauses(); + $dataType = self::_getDataType(); + $attachmentType = self::_getAttachmentType(); + self::$_db->exec( + 'CREATE TABLE ' . self::_sanitizeIdentifier('paste') . ' ( ' . + "dataid CHAR(16) NOT NULL$main_key, " . + "data $attachmentType, " . + 'postdate INT, ' . + 'expiredate INT, ' . + 'opendiscussion INT, ' . + 'burnafterreading INT, ' . + 'meta TEXT, ' . + "attachment $attachmentType, " . + "attachmentname $dataType$after_key );" + ); + } + + /** + * create the paste table + * + * @access private + * @static + */ + private static function _createCommentTable() + { + list($main_key, $after_key) = self::_getPrimaryKeyClauses(); + $dataType = self::_getDataType(); + self::$_db->exec( + 'CREATE TABLE ' . self::_sanitizeIdentifier('comment') . ' ( ' . + "dataid CHAR(16) NOT NULL$main_key, " . + 'pasteid CHAR(16), ' . + 'parentid CHAR(16), ' . + "data $dataType, " . + "nickname $dataType, " . + "vizhash $dataType, " . + "postdate INT$after_key );" + ); + self::$_db->exec( + 'CREATE INDEX IF NOT EXISTS comment_parent ON ' . + self::_sanitizeIdentifier('comment') . '(pasteid);' + ); + } + + /** + * create the paste table + * + * @access private + * @static + */ + private static function _createConfigTable() + { + list($main_key, $after_key) = self::_getPrimaryKeyClauses('id'); + self::$_db->exec( + 'CREATE TABLE ' . self::_sanitizeIdentifier('config') . + " ( id CHAR(16) NOT NULL$main_key, value TEXT$after_key );" + ); + self::_exec( + 'INSERT INTO ' . self::_sanitizeIdentifier('config') . + ' VALUES(?,?)', + array('VERSION', Controller::VERSION) + ); + } + + /** + * sanitizes identifiers + * + * @access private + * @static + * @param string $identifier + * @return string + */ + private static function _sanitizeIdentifier($identifier) + { + return preg_replace('/[^A-Za-z0-9_]+/', '', self::$_prefix . $identifier); + } + + /** + * upgrade the database schema from an old version + * + * @access private + * @static + * @param string $oldversion + */ + private static function _upgradeDatabase($oldversion) + { + $dataType = self::_getDataType(); + $attachmentType = self::_getAttachmentType(); + switch ($oldversion) { + case '0.21': + // create the meta column if necessary (pre 0.21 change) + try { + self::$_db->exec('SELECT meta FROM ' . self::_sanitizeIdentifier('paste') . ' LIMIT 1;'); + } catch (PDOException $e) { + self::$_db->exec('ALTER TABLE ' . self::_sanitizeIdentifier('paste') . ' ADD COLUMN meta TEXT;'); + } + // SQLite only allows one ALTER statement at a time... + self::$_db->exec( + 'ALTER TABLE ' . self::_sanitizeIdentifier('paste') . + " ADD COLUMN attachment $attachmentType;" + ); + self::$_db->exec( + 'ALTER TABLE ' . self::_sanitizeIdentifier('paste') . " ADD COLUMN attachmentname $dataType;" + ); + // SQLite doesn't support MODIFY, but it allows TEXT of similar + // size as BLOB, so there is no need to change it there + if (self::$_type !== 'sqlite') { + self::$_db->exec( + 'ALTER TABLE ' . self::_sanitizeIdentifier('paste') . + " ADD PRIMARY KEY (dataid), MODIFY COLUMN data $dataType;" + ); + self::$_db->exec( + 'ALTER TABLE ' . self::_sanitizeIdentifier('comment') . + " ADD PRIMARY KEY (dataid), MODIFY COLUMN data $dataType, " . + "MODIFY COLUMN nickname $dataType, MODIFY COLUMN vizhash $dataType;" + ); + } else { + self::$_db->exec( + 'CREATE UNIQUE INDEX IF NOT EXISTS paste_dataid ON ' . + self::_sanitizeIdentifier('paste') . '(dataid);' + ); + self::$_db->exec( + 'CREATE UNIQUE INDEX IF NOT EXISTS comment_dataid ON ' . + self::_sanitizeIdentifier('comment') . '(dataid);' + ); + } + self::$_db->exec( + 'CREATE INDEX IF NOT EXISTS comment_parent ON ' . + self::_sanitizeIdentifier('comment') . '(pasteid);' + ); + // no break, continue with updates for 0.22 and later + case '1.3': + // SQLite doesn't support MODIFY, but it allows TEXT of similar + // size as BLOB and PostgreSQL uses TEXT, so there is no need + // to change it there + if (self::$_type !== 'sqlite' && self::$_type !== 'pgsql') { + self::$_db->exec( + 'ALTER TABLE ' . self::_sanitizeIdentifier('paste') . + " MODIFY COLUMN data $attachmentType;" + ); + } + // no break, continue with updates for all newer versions + default: + self::_exec( + 'UPDATE ' . self::_sanitizeIdentifier('config') . + ' SET value = ? WHERE id = ?', + array(Controller::VERSION, 'VERSION') + ); + } + } +} diff --git a/lib/Data/Filesystem.php b/lib/Data/Filesystem.php new file mode 100644 index 00000000..41237d40 --- /dev/null +++ b/lib/Data/Filesystem.php @@ -0,0 +1,365 @@ +exists($pasteid)) { + return false; + } + return self::upgradePreV1Format( + DataStore::get(self::_dataid2path($pasteid) . $pasteid . '.php') + ); + } + + /** + * Delete a paste and its discussion. + * + * @access public + * @param string $pasteid + */ + public function delete($pasteid) + { + $pastedir = self::_dataid2path($pasteid); + if (is_dir($pastedir)) { + // Delete the paste itself. + if (is_file($pastedir . $pasteid . '.php')) { + unlink($pastedir . $pasteid . '.php'); + } + + // Delete discussion if it exists. + $discdir = self::_dataid2discussionpath($pasteid); + if (is_dir($discdir)) { + // Delete all files in discussion directory + $dir = dir($discdir); + while (false !== ($filename = $dir->read())) { + if (is_file($discdir . $filename)) { + unlink($discdir . $filename); + } + } + $dir->close(); + rmdir($discdir); + } + } + } + + /** + * Test if a paste exists. + * + * @access public + * @param string $pasteid + * @return bool + */ + public function exists($pasteid) + { + $basePath = self::_dataid2path($pasteid) . $pasteid; + $pastePath = $basePath . '.php'; + // convert to PHP protected files if needed + if (is_readable($basePath)) { + DataStore::prependRename($basePath, $pastePath); + + // convert comments, too + $discdir = self::_dataid2discussionpath($pasteid); + if (is_dir($discdir)) { + $dir = dir($discdir); + while (false !== ($filename = $dir->read())) { + if (substr($filename, -4) !== '.php' && strlen($filename) >= 16) { + $commentFilename = $discdir . $filename . '.php'; + DataStore::prependRename($discdir . $filename, $commentFilename); + } + } + $dir->close(); + } + } + return is_readable($pastePath); + } + + /** + * Create a comment in a paste. + * + * @access public + * @param string $pasteid + * @param string $parentid + * @param string $commentid + * @param array $comment + * @return bool + */ + public function createComment($pasteid, $parentid, $commentid, array $comment) + { + $storagedir = self::_dataid2discussionpath($pasteid); + $file = $storagedir . $pasteid . '.' . $commentid . '.' . $parentid . '.php'; + if (is_file($file)) { + return false; + } + if (!is_dir($storagedir)) { + mkdir($storagedir, 0700, true); + } + return DataStore::store($file, $comment); + } + + /** + * Read all comments of paste. + * + * @access public + * @param string $pasteid + * @return array + */ + public function readComments($pasteid) + { + $comments = array(); + $discdir = self::_dataid2discussionpath($pasteid); + if (is_dir($discdir)) { + $dir = dir($discdir); + while (false !== ($filename = $dir->read())) { + // Filename is in the form pasteid.commentid.parentid.php: + // - pasteid is the paste this reply belongs to. + // - commentid is the comment identifier itself. + // - parentid is the comment this comment replies to (It can be pasteid) + if (is_file($discdir . $filename)) { + $comment = DataStore::get($discdir . $filename); + $items = explode('.', $filename); + // Add some meta information not contained in file. + $comment['id'] = $items[1]; + $comment['parentid'] = $items[2]; + + // Store in array + $key = $this->getOpenSlot($comments, (int) $comment['meta']['created']); + $comments[$key] = $comment; + } + } + $dir->close(); + + // Sort comments by date, oldest first. + ksort($comments); + } + return $comments; + } + + /** + * Test if a comment exists. + * + * @access public + * @param string $pasteid + * @param string $parentid + * @param string $commentid + * @return bool + */ + public function existsComment($pasteid, $parentid, $commentid) + { + return is_file( + self::_dataid2discussionpath($pasteid) . + $pasteid . '.' . $commentid . '.' . $parentid . '.php' + ); + } + + /** + * Returns up to batch size number of paste ids that have expired + * + * @access private + * @param int $batchsize + * @return array + */ + protected function _getExpiredPastes($batchsize) + { + $pastes = array(); + $mainpath = DataStore::getPath(); + $firstLevel = array_filter( + scandir($mainpath), + 'self::_isFirstLevelDir' + ); + if (count($firstLevel) > 0) { + // try at most 10 times the $batchsize pastes before giving up + for ($i = 0, $max = $batchsize * 10; $i < $max; ++$i) { + $firstKey = array_rand($firstLevel); + $secondLevel = array_filter( + scandir($mainpath . DIRECTORY_SEPARATOR . $firstLevel[$firstKey]), + 'self::_isSecondLevelDir' + ); + + // skip this folder in the next checks if it is empty + if (count($secondLevel) == 0) { + unset($firstLevel[$firstKey]); + continue; + } + + $secondKey = array_rand($secondLevel); + $path = $mainpath . DIRECTORY_SEPARATOR . + $firstLevel[$firstKey] . DIRECTORY_SEPARATOR . + $secondLevel[$secondKey]; + if (!is_dir($path)) { + continue; + } + $thirdLevel = array_filter( + array_map( + function ($filename) { + return strlen($filename) >= 20 ? + substr($filename, 0, -4) : + $filename; + }, + scandir($path) + ), + 'PrivateBin\\Model\\Paste::isValidId' + ); + if (count($thirdLevel) == 0) { + continue; + } + $thirdKey = array_rand($thirdLevel); + $pasteid = $thirdLevel[$thirdKey]; + if (in_array($pasteid, $pastes)) { + continue; + } + + if ($this->exists($pasteid)) { + $data = $this->read($pasteid); + if ( + array_key_exists('expire_date', $data['meta']) && + $data['meta']['expire_date'] < time() + ) { + $pastes[] = $pasteid; + if (count($pastes) >= $batchsize) { + break; + } + } + } + } + } + return $pastes; + } + + /** + * Convert paste id to storage path. + * + * The idea is to creates subdirectories in order to limit the number of files per directory. + * (A high number of files in a single directory can slow things down.) + * eg. "f468483c313401e8" will be stored in "data/f4/68/f468483c313401e8" + * High-trafic websites may want to deepen the directory structure (like Squid does). + * + * eg. input 'e3570978f9e4aa90' --> output 'data/e3/57/' + * + * @access private + * @static + * @param string $dataid + * @return string + */ + private static function _dataid2path($dataid) + { + return DataStore::getPath( + substr($dataid, 0, 2) . DIRECTORY_SEPARATOR . + substr($dataid, 2, 2) . DIRECTORY_SEPARATOR + ); + } + + /** + * Convert paste id to discussion storage path. + * + * eg. input 'e3570978f9e4aa90' --> output 'data/e3/57/e3570978f9e4aa90.discussion/' + * + * @access private + * @static + * @param string $dataid + * @return string + */ + private static function _dataid2discussionpath($dataid) + { + return self::_dataid2path($dataid) . $dataid . + '.discussion' . DIRECTORY_SEPARATOR; + } + + /** + * Check that the given element is a valid first level directory. + * + * @access private + * @static + * @param string $element + * @return bool + */ + private static function _isFirstLevelDir($element) + { + return self::_isSecondLevelDir($element) && + is_dir(DataStore::getPath($element)); + } + + /** + * Check that the given element is a valid second level directory. + * + * @access private + * @static + * @param string $element + * @return bool + */ + private static function _isSecondLevelDir($element) + { + return (bool) preg_match('/^[a-f0-9]{2}$/', $element); + } +} diff --git a/lib/Filter.php b/lib/Filter.php new file mode 100644 index 00000000..19aeb38d --- /dev/null +++ b/lib/Filter.php @@ -0,0 +1,90 @@ += 1) { + $size = $size / 1024; + ++$i; + } + return number_format($size, ($i ? 2 : 0), '.', ' ') . ' ' . I18n::_($iec[$i]); + } + + /** + * fixed time string comparison operation to prevent timing attacks + * https://crackstation.net/hashing-security.htm?=rd#slowequals + * + * @access public + * @static + * @param string $a + * @param string $b + * @return bool + */ + public static function slowEquals($a, $b) + { + $diff = strlen($a) ^ strlen($b); + for ($i = 0; $i < strlen($a) && $i < strlen($b); ++$i) { + $diff |= ord($a[$i]) ^ ord($b[$i]); + } + return $diff === 0; + } +} diff --git a/lib/FormatV2.php b/lib/FormatV2.php new file mode 100644 index 00000000..3e98c4e6 --- /dev/null +++ b/lib/FormatV2.php @@ -0,0 +1,127 @@ + 24) { + return false; + } + // - salt + if (strlen($cipherParams[1]) > 14) { + return false; + } + + // Make sure some fields contain no unsupported values: + // - version + if (!(is_int($message['v']) || is_float($message['v'])) || (float) $message['v'] < 2) { + return false; + } + // - iterations, refuse less then 10000 iterations (minimum NIST recommendation) + if (!is_int($cipherParams[2]) || $cipherParams[2] <= 10000) { + return false; + } + // - key size + if (!in_array($cipherParams[3], array(128, 192, 256), true)) { + return false; + } + // - tag size + if (!in_array($cipherParams[4], array(64, 96, 128), true)) { + return false; + } + // - algorithm, must be AES + if ($cipherParams[5] !== 'aes') { + return false; + } + // - mode + if (!in_array($cipherParams[6], array('ctr', 'cbc', 'gcm'), true)) { + return false; + } + // - compression + if (!in_array($cipherParams[7], array('zlib', 'none'), true)) { + return false; + } + + // Reject data if entropy is too low + if (strlen($ct) > strlen(gzdeflate($ct))) { + return false; + } + + // require only the key 'expire' in the metadata of pastes + if (!$isComment && ( + count($message['meta']) === 0 || + !array_key_exists('expire', $message['meta']) || + count($message['meta']) > 1 + )) { + return false; + } + + return true; + } +} diff --git a/lib/I18n.php b/lib/I18n.php new file mode 100644 index 00000000..ed1a1d98 --- /dev/null +++ b/lib/I18n.php @@ -0,0 +1,390 @@ + 1 ? $messageId[1] : $messageId[0]; + } + if (!array_key_exists($messageId, self::$_translations)) { + self::$_translations[$messageId] = $messages; + } + $args = func_get_args(); + if (is_array(self::$_translations[$messageId])) { + $number = (int) $args[1]; + $key = self::_getPluralForm($number); + $max = count(self::$_translations[$messageId]) - 1; + if ($key > $max) { + $key = $max; + } + + $args[0] = self::$_translations[$messageId][$key]; + $args[1] = $number; + } else { + $args[0] = self::$_translations[$messageId]; + } + return call_user_func_array('sprintf', $args); + } + + /** + * loads translations + * + * From: https://stackoverflow.com/questions/3770513/detect-browser-language-in-php#3771447 + * + * @access public + * @static + */ + public static function loadTranslations() + { + $availableLanguages = self::getAvailableLanguages(); + + // check if the lang cookie was set and that language exists + if ( + array_key_exists('lang', $_COOKIE) && + ($key = array_search($_COOKIE['lang'], $availableLanguages)) !== false + ) { + $match = $availableLanguages[$key]; + } + // find a translation file matching the browsers language preferences + else { + $match = self::_getMatchingLanguage( + self::getBrowserLanguages(), $availableLanguages + ); + } + + // load translations + self::$_language = $match; + self::$_translations = ($match == 'en') ? array() : Json::decode( + file_get_contents(self::_getPath($match . '.json')) + ); + } + + /** + * get list of available translations based on files found + * + * @access public + * @static + * @return array + */ + public static function getAvailableLanguages() + { + if (count(self::$_availableLanguages) == 0) { + $i18n = dir(self::_getPath()); + while (false !== ($file = $i18n->read())) { + if (preg_match('/^([a-z]{2}).json$/', $file, $match) === 1) { + self::$_availableLanguages[] = $match[1]; + } + } + self::$_availableLanguages[] = 'en'; + } + return self::$_availableLanguages; + } + + /** + * detect the clients supported languages and return them ordered by preference + * + * From: https://stackoverflow.com/questions/3770513/detect-browser-language-in-php#3771447 + * + * @access public + * @static + * @return array + */ + public static function getBrowserLanguages() + { + $languages = array(); + if (array_key_exists('HTTP_ACCEPT_LANGUAGE', $_SERVER)) { + $languageRanges = explode(',', trim($_SERVER['HTTP_ACCEPT_LANGUAGE'])); + foreach ($languageRanges as $languageRange) { + if (preg_match( + '/(\*|[a-zA-Z0-9]{1,8}(?:-[a-zA-Z0-9]{1,8})*)(?:\s*;\s*q\s*=\s*(0(?:\.\d{0,3})|1(?:\.0{0,3})))?/', + trim($languageRange), $match + )) { + if (!isset($match[2])) { + $match[2] = '1.0'; + } else { + $match[2] = (string) floatval($match[2]); + } + if (!isset($languages[$match[2]])) { + $languages[$match[2]] = array(); + } + $languages[$match[2]][] = strtolower($match[1]); + } + } + krsort($languages); + } + return $languages; + } + + /** + * get currently loaded language + * + * @access public + * @static + * @return string + */ + public static function getLanguage() + { + return self::$_language; + } + + /** + * get list of language labels + * + * Only for given language codes, otherwise all labels. + * + * @access public + * @static + * @param array $languages + * @return array + */ + public static function getLanguageLabels($languages = array()) + { + $file = self::_getPath('languages.json'); + if (count(self::$_languageLabels) == 0 && is_readable($file)) { + self::$_languageLabels = Json::decode(file_get_contents($file)); + } + if (count($languages) == 0) { + return self::$_languageLabels; + } + return array_intersect_key(self::$_languageLabels, array_flip($languages)); + } + + /** + * set the default language + * + * @access public + * @static + * @param string $lang + */ + public static function setLanguageFallback($lang) + { + if (in_array($lang, self::getAvailableLanguages())) { + self::$_languageFallback = $lang; + } + } + + /** + * get language file path + * + * @access protected + * @static + * @param string $file + * @return string + */ + protected static function _getPath($file = '') + { + if (strlen(self::$_path) == 0) { + self::$_path = PUBLIC_PATH . DIRECTORY_SEPARATOR . 'i18n'; + } + return self::$_path . (strlen($file) ? DIRECTORY_SEPARATOR . $file : ''); + } + + /** + * determines the plural form to use based on current language and given number + * + * From: http://localization-guide.readthedocs.org/en/latest/l10n/pluralforms.html + * + * @access protected + * @static + * @param int $n + * @return int + */ + protected static function _getPluralForm($n) + { + switch (self::$_language) { + case 'cs': + return $n == 1 ? 0 : ($n >= 2 && $n <= 4 ? 1 : 2); + case 'fr': + case 'oc': + case 'zh': + return $n > 1 ? 1 : 0; + case 'pl': + return $n == 1 ? 0 : ($n % 10 >= 2 && $n % 10 <= 4 && ($n % 100 < 10 || $n % 100 >= 20) ? 1 : 2); + case 'ru': + case 'uk': + return $n % 10 == 1 && $n % 100 != 11 ? 0 : ($n % 10 >= 2 && $n % 10 <= 4 && ($n % 100 < 10 || $n % 100 >= 20) ? 1 : 2); + case 'sl': + return $n % 100 == 1 ? 1 : ($n % 100 == 2 ? 2 : ($n % 100 == 3 || $n % 100 == 4 ? 3 : 0)); + // bg, de, en, es, hu, it, nl, no, pt + default: + return $n != 1 ? 1 : 0; + } + } + + /** + * compares two language preference arrays and returns the preferred match + * + * From: https://stackoverflow.com/questions/3770513/detect-browser-language-in-php#3771447 + * + * @access protected + * @static + * @param array $acceptedLanguages + * @param array $availableLanguages + * @return string + */ + protected static function _getMatchingLanguage($acceptedLanguages, $availableLanguages) + { + $matches = array(); + $any = false; + foreach ($acceptedLanguages as $acceptedQuality => $acceptedValues) { + $acceptedQuality = floatval($acceptedQuality); + if ($acceptedQuality === 0.0) { + continue; + } + foreach ($availableLanguages as $availableValue) { + $availableQuality = 1.0; + foreach ($acceptedValues as $acceptedValue) { + if ($acceptedValue === '*') { + $any = true; + } + $matchingGrade = self::_matchLanguage($acceptedValue, $availableValue); + if ($matchingGrade > 0) { + $q = (string) ($acceptedQuality * $availableQuality * $matchingGrade); + if (!isset($matches[$q])) { + $matches[$q] = array(); + } + if (!in_array($availableValue, $matches[$q])) { + $matches[$q][] = $availableValue; + } + } + } + } + } + if (count($matches) === 0 && $any) { + if (count($availableLanguages) > 0) { + $matches['1.0'] = $availableLanguages; + } + } + if (count($matches) === 0) { + return self::$_languageFallback; + } + krsort($matches); + $topmatches = current($matches); + return current($topmatches); + } + + /** + * compare two language IDs and return the degree they match + * + * From: https://stackoverflow.com/questions/3770513/detect-browser-language-in-php#3771447 + * + * @access protected + * @static + * @param string $a + * @param string $b + * @return float + */ + protected static function _matchLanguage($a, $b) + { + $a = explode('-', $a); + $b = explode('-', $b); + for ($i = 0, $n = min(count($a), count($b)); $i < $n; ++$i) { + if ($a[$i] !== $b[$i]) { + break; + } + } + return $i === 0 ? 0 : (float) $i / count($a); + } +} diff --git a/lib/Json.php b/lib/Json.php new file mode 100644 index 00000000..c7ce68ec --- /dev/null +++ b/lib/Json.php @@ -0,0 +1,78 @@ +_conf = $conf; + } + + /** + * Get a paste, optionally a specific instance. + * + * @param string $pasteId + * @return Paste + */ + public function getPaste($pasteId = null) + { + $paste = new Paste($this->_conf, $this->_getStore()); + if ($pasteId !== null) { + $paste->setId($pasteId); + } + return $paste; + } + + /** + * Checks if a purge is necessary and triggers it if yes. + */ + public function purge() + { + PurgeLimiter::setConfiguration($this->_conf); + if (PurgeLimiter::canPurge()) { + $this->_getStore()->purge($this->_conf->getKey('batchsize', 'purge')); + } + } + + /** + * Gets, and creates if neccessary, a store object + * + * @return Data\AbstractData + */ + private function _getStore() + { + if ($this->_store === null) { + $this->_store = forward_static_call( + 'PrivateBin\\Data\\' . $this->_conf->getKey('class', 'model') . '::getInstance', + $this->_conf->getSection('model_options') + ); + } + return $this->_store; + } +} diff --git a/lib/Model/AbstractModel.php b/lib/Model/AbstractModel.php new file mode 100644 index 00000000..1fd36e84 --- /dev/null +++ b/lib/Model/AbstractModel.php @@ -0,0 +1,181 @@ + array()); + + /** + * Configuration. + * + * @access protected + * @var Configuration + */ + protected $_conf; + + /** + * Data storage. + * + * @access protected + * @var AbstractData + */ + protected $_store; + + /** + * Instance constructor. + * + * @access public + * @param Configuration $configuration + * @param AbstractData $storage + */ + public function __construct(Configuration $configuration, AbstractData $storage) + { + $this->_conf = $configuration; + $this->_store = $storage; + } + + /** + * Get ID. + * + * @access public + * @return string + */ + public function getId() + { + return $this->_id; + } + + /** + * Set ID. + * + * @access public + * @param string $id + * @throws Exception + */ + public function setId($id) + { + if (!self::isValidId($id)) { + throw new Exception('Invalid paste ID.', 60); + } + $this->_id = $id; + } + + /** + * Set data and recalculate ID. + * + * @access public + * @param array $data + * @throws Exception + */ + public function setData(array $data) + { + $data = $this->_sanitize($data); + $this->_validate($data); + $this->_data = $data; + + // calculate a 64 bit checksum to avoid collisions + $this->setId(hash(version_compare(PHP_VERSION, '5.6', '<') ? 'fnv164' : 'fnv1a64', $data['ct'])); + } + + /** + * Get instance data. + * + * @access public + * @return array + */ + public function get() + { + return $this->_data; + } + + /** + * Store the instance's data. + * + * @access public + * @throws Exception + */ + abstract public function store(); + + /** + * Delete the current instance. + * + * @access public + * @throws Exception + */ + abstract public function delete(); + + /** + * Test if current instance exists in store. + * + * @access public + * @return bool + */ + abstract public function exists(); + + /** + * Validate ID. + * + * @access public + * @static + * @param string $id + * @return bool + */ + public static function isValidId($id) + { + return (bool) preg_match('#\A[a-f\d]{16}\z#', (string) $id); + } + + /** + * Sanitizes data to conform with current configuration. + * + * @access protected + * @param array $data + * @return array + */ + abstract protected function _sanitize(array $data); + + /** + * Validate data. + * + * @access protected + * @param array $data + * @throws Exception + */ + protected function _validate(array $data) + { + } +} diff --git a/lib/Model/Comment.php b/lib/Model/Comment.php new file mode 100644 index 00000000..960934da --- /dev/null +++ b/lib/Model/Comment.php @@ -0,0 +1,185 @@ +getPaste()->getId(); + if (!$this->getPaste()->exists()) { + throw new Exception('Invalid data.', 67); + } + + // Make sure the discussion is opened in this paste and in configuration. + if (!$this->getPaste()->isOpendiscussion() || !$this->_conf->getKey('discussion')) { + throw new Exception('Invalid data.', 68); + } + + // Check for improbable collision. + if ($this->exists()) { + throw new Exception('You are unlucky. Try again.', 69); + } + + $this->_data['meta']['created'] = time(); + + // store comment + if ( + $this->_store->createComment( + $pasteid, + $this->getParentId(), + $this->getId(), + $this->_data + ) === false + ) { + throw new Exception('Error saving comment. Sorry.', 70); + } + } + + /** + * Delete the comment. + * + * @access public + * @throws Exception + */ + public function delete() + { + throw new Exception('To delete a comment, delete its parent paste', 64); + } + + /** + * Test if comment exists in store. + * + * @access public + * @return bool + */ + public function exists() + { + return $this->_store->existsComment( + $this->getPaste()->getId(), + $this->getParentId(), + $this->getId() + ); + } + + /** + * Set paste. + * + * @access public + * @param Paste $paste + * @throws Exception + */ + public function setPaste(Paste $paste) + { + $this->_paste = $paste; + $this->_data['pasteid'] = $paste->getId(); + } + + /** + * Get paste. + * + * @access public + * @return Paste + */ + public function getPaste() + { + return $this->_paste; + } + + /** + * Set parent ID. + * + * @access public + * @param string $id + * @throws Exception + */ + public function setParentId($id) + { + if (!self::isValidId($id)) { + throw new Exception('Invalid paste ID.', 65); + } + $this->_data['parentid'] = $id; + } + + /** + * Get parent ID. + * + * @access public + * @return string + */ + public function getParentId() + { + if (!array_key_exists('parentid', $this->_data)) { + $this->_data['parentid'] = $this->getPaste()->getId(); + } + return $this->_data['parentid']; + } + + /** + * Sanitizes data to conform with current configuration. + * + * @access protected + * @param array $data + * @return array + */ + protected function _sanitize(array $data) + { + // we generate an icon based on a SHA512 HMAC of the users IP, if configured + $icon = $this->_conf->getKey('icon'); + if ($icon != 'none') { + $pngdata = ''; + $hmac = TrafficLimiter::getHash(); + if ($icon == 'identicon') { + $identicon = new Identicon(); + $pngdata = $identicon->getImageDataUri($hmac, 16); + } elseif ($icon == 'vizhash') { + $vh = new Vizhash16x16(); + $pngdata = 'data:image/png;base64,' . base64_encode( + $vh->generate($hmac) + ); + } + if ($pngdata != '') { + if (!array_key_exists('meta', $data)) { + $data['meta'] = array(); + } + $data['meta']['icon'] = $pngdata; + } + } + return $data; + } +} diff --git a/lib/Model/Paste.php b/lib/Model/Paste.php new file mode 100644 index 00000000..8d6dfaf5 --- /dev/null +++ b/lib/Model/Paste.php @@ -0,0 +1,258 @@ +_store->read($this->getId()); + if ($data === false) { + throw new Exception(Controller::GENERIC_ERROR, 64); + } + + // check if paste has expired and delete it if neccessary. + if (array_key_exists('expire_date', $data['meta'])) { + if ($data['meta']['expire_date'] < time()) { + $this->delete(); + throw new Exception(Controller::GENERIC_ERROR, 63); + } + // We kindly provide the remaining time before expiration (in seconds) + $data['meta']['time_to_live'] = $data['meta']['expire_date'] - time(); + unset($data['meta']['expire_date']); + } + + // check if non-expired burn after reading paste needs to be deleted + if ( + (array_key_exists('adata', $data) && $data['adata'][3] === 1) || + (array_key_exists('burnafterreading', $data['meta']) && $data['meta']['burnafterreading']) + ) { + $this->delete(); + } + + // set formatter for the view in version 1 pastes. + if (array_key_exists('data', $data) && !array_key_exists('formatter', $data['meta'])) { + // support < 0.21 syntax highlighting + if (array_key_exists('syntaxcoloring', $data['meta']) && $data['meta']['syntaxcoloring'] === true) { + $data['meta']['formatter'] = 'syntaxhighlighting'; + } else { + $data['meta']['formatter'] = $this->_conf->getKey('defaultformatter'); + } + } + + // support old paste format with server wide salt + if (!array_key_exists('salt', $data['meta'])) { + $data['meta']['salt'] = ServerSalt::get(); + } + $data['comments'] = array_values($this->getComments()); + $data['comment_count'] = count($data['comments']); + $data['comment_offset'] = 0; + $data['@context'] = '?jsonld=paste'; + $this->_data = $data; + + return $this->_data; + } + + /** + * Store the paste's data. + * + * @access public + * @throws Exception + */ + public function store() + { + // Check for improbable collision. + if ($this->exists()) { + throw new Exception('You are unlucky. Try again.', 75); + } + + $this->_data['meta']['created'] = time(); + $this->_data['meta']['salt'] = serversalt::generate(); + + // store paste + if ( + $this->_store->create( + $this->getId(), + $this->_data + ) === false + ) { + throw new Exception('Error saving paste. Sorry.', 76); + } + } + + /** + * Delete the paste. + * + * @access public + * @throws Exception + */ + public function delete() + { + $this->_store->delete($this->getId()); + } + + /** + * Test if paste exists in store. + * + * @access public + * @return bool + */ + public function exists() + { + return $this->_store->exists($this->getId()); + } + + /** + * Get a comment, optionally a specific instance. + * + * @access public + * @param string $parentId + * @param string $commentId + * @throws Exception + * @return Comment + */ + public function getComment($parentId, $commentId = '') + { + if (!$this->exists()) { + throw new Exception('Invalid data.', 62); + } + $comment = new Comment($this->_conf, $this->_store); + $comment->setPaste($this); + $comment->setParentId($parentId); + if ($commentId !== '') { + $comment->setId($commentId); + } + return $comment; + } + + /** + * Get all comments, if any. + * + * @access public + * @return array + */ + public function getComments() + { + return $this->_store->readComments($this->getId()); + } + + /** + * Generate the "delete" token. + * + * The token is the hmac of the pastes ID signed with the server salt. + * The paste can be deleted by calling: + * https://example.com/privatebin/?pasteid=&deletetoken= + * + * @access public + * @return string + */ + public function getDeleteToken() + { + if (!array_key_exists('salt', $this->_data['meta'])) { + $this->get(); + } + return hash_hmac( + $this->_conf->getKey('zerobincompatibility') ? 'sha1' : 'sha256', + $this->getId(), + $this->_data['meta']['salt'] + ); + } + + /** + * Check if paste has discussions enabled. + * + * @access public + * @throws Exception + * @return bool + */ + public function isOpendiscussion() + { + if (!array_key_exists('adata', $this->_data) && !array_key_exists('data', $this->_data)) { + $this->get(); + } + return + (array_key_exists('adata', $this->_data) && $this->_data['adata'][2] === 1) || + (array_key_exists('opendiscussion', $this->_data['meta']) && $this->_data['meta']['opendiscussion']); + } + + /** + * Sanitizes data to conform with current configuration. + * + * @access protected + * @param array $data + * @return array + */ + protected function _sanitize(array $data) + { + $expiration = $data['meta']['expire']; + unset($data['meta']['expire']); + $expire_options = $this->_conf->getSection('expire_options'); + if (array_key_exists($expiration, $expire_options)) { + $expire = $expire_options[$expiration]; + } else { + // using getKey() to ensure a default value is present + $expire = $this->_conf->getKey($this->_conf->getKey('default', 'expire'), 'expire_options'); + } + if ($expire > 0) { + $data['meta']['expire_date'] = time() + $expire; + } + return $data; + } + + /** + * Validate data. + * + * @access protected + * @param array $data + * @throws Exception + */ + protected function _validate(array $data) + { + // reject invalid or disabled formatters + if (!array_key_exists($data['adata'][1], $this->_conf->getSection('formatter_options'))) { + throw new Exception('Invalid data.', 75); + } + + // discussion requested, but disabled in config or burn after reading requested as well, or invalid integer + if ( + ($data['adata'][2] === 1 && ( // open discussion flag + !$this->_conf->getKey('discussion') || + $data['adata'][3] === 1 // burn after reading flag + )) || + ($data['adata'][2] !== 0 && $data['adata'][2] !== 1) + ) { + throw new Exception('Invalid data.', 74); + } + + // reject invalid burn after reading + if ($data['adata'][3] !== 0 && $data['adata'][3] !== 1) { + throw new Exception('Invalid data.', 73); + } + } +} diff --git a/lib/Persistence/AbstractPersistence.php b/lib/Persistence/AbstractPersistence.php new file mode 100644 index 00000000..62ed6659 --- /dev/null +++ b/lib/Persistence/AbstractPersistence.php @@ -0,0 +1,125 @@ +getKey('limit', 'purge')); + self::setPath($conf->getKey('dir', 'purge')); + } + + /** + * check if the purge can be performed + * + * @access public + * @static + * @throws \Exception + * @return bool + */ + public static function canPurge() + { + // disable limits if set to less then 1 + if (self::$_limit < 1) { + return true; + } + + $now = time(); + $file = 'purge_limiter.php'; + if (self::_exists($file)) { + require self::getPath($file); + $pl = $GLOBALS['purge_limiter']; + if ($pl + self::$_limit >= $now) { + return false; + } + } + + $content = 'getKey('limit', 'traffic')); + self::setPath($conf->getKey('dir', 'traffic')); + if (($option = $conf->getKey('header', 'traffic')) !== null) { + $httpHeader = 'HTTP_' . $option; + if (array_key_exists($httpHeader, $_SERVER) && !empty($_SERVER[$httpHeader])) { + self::$_ipKey = $httpHeader; + } + } + } + + /** + * get a HMAC of the current visitors IP address + * + * @access public + * @static + * @param string $algo + * @return string + */ + public static function getHash($algo = 'sha512') + { + return hash_hmac($algo, $_SERVER[self::$_ipKey], ServerSalt::get()); + } + + /** + * traffic limiter + * + * Make sure the IP address makes at most 1 request every 10 seconds. + * + * @access public + * @static + * @throws \Exception + * @return bool + */ + public static function canPass() + { + // disable limits if set to less then 1 + if (self::$_limit < 1) { + return true; + } + + $file = 'traffic_limiter.php'; + if (self::_exists($file)) { + require self::getPath($file); + $tl = $GLOBALS['traffic_limiter']; + } else { + $tl = array(); + } + + // purge file of expired hashes to keep it small + $now = time(); + foreach ($tl as $key => $time) { + if ($time + self::$_limit < $now) { + unset($tl[$key]); + } + } + + // this hash is used as an array key, hence a shorter algo is used + $hash = self::getHash('sha256'); + if (array_key_exists($hash, $tl) && ($tl[$hash] + self::$_limit >= $now)) { + $result = false; + } else { + $tl[$hash] = time(); + $result = true; + } + self::_store( + $file, + ' $value) { + // only return if value is empty and key matches RegEx + if (($value === '') and preg_match($pasteIdRegEx, $key, $match)) { + return $match[0]; + } + } + + return 'invalid id'; + } + + /** + * Constructor + * + * @access public + */ + public function __construct() + { + // decide if we are in JSON API or HTML context + $this->_isJsonApi = $this->_detectJsonRequest(); + + // parse parameters, depending on request type + switch (array_key_exists('REQUEST_METHOD', $_SERVER) ? $_SERVER['REQUEST_METHOD'] : 'GET') { + case 'DELETE': + case 'PUT': + case 'POST': + $this->_params = Json::decode( + file_get_contents(self::$_inputStream) + ); + break; + default: + $this->_params = $_GET; + } + if ( + !array_key_exists('pasteid', $this->_params) && + !array_key_exists('jsonld', $this->_params) && + array_key_exists('QUERY_STRING', $_SERVER) && + !empty($_SERVER['QUERY_STRING']) + ) { + $this->_params['pasteid'] = $this->getPasteId(); + } + + // prepare operation, depending on current parameters + if ( + array_key_exists('ct', $this->_params) && + !empty($this->_params['ct']) + ) { + $this->_operation = 'create'; + } elseif (array_key_exists('pasteid', $this->_params) && !empty($this->_params['pasteid'])) { + if (array_key_exists('deletetoken', $this->_params) && !empty($this->_params['deletetoken'])) { + $this->_operation = 'delete'; + } else { + $this->_operation = 'read'; + } + } elseif (array_key_exists('jsonld', $this->_params) && !empty($this->_params['jsonld'])) { + $this->_operation = 'jsonld'; + } + } + + /** + * Get current operation + * + * @access public + * @return string + */ + public function getOperation() + { + return $this->_operation; + } + + /** + * Get data of paste or comment + * + * @access public + * @return array + */ + public function getData() + { + $data = array( + 'adata' => $this->getParam('adata'), + ); + $required_keys = array('v', 'ct'); + $meta = $this->getParam('meta'); + if (empty($meta)) { + $required_keys[] = 'pasteid'; + $required_keys[] = 'parentid'; + } else { + $data['meta'] = $meta; + } + foreach ($required_keys as $key) { + $data[$key] = $this->getParam($key); + } + // forcing a cast to int or float + $data['v'] = $data['v'] + 0; + return $data; + } + + /** + * Get a request parameter + * + * @access public + * @param string $param + * @param string $default + * @return string + */ + public function getParam($param, $default = '') + { + return array_key_exists($param, $this->_params) ? + $this->_params[$param] : $default; + } + + /** + * Get host as requested by the client + * + * @access public + * @return string + */ + public function getHost() + { + return array_key_exists('HTTP_HOST', $_SERVER) ? + htmlspecialchars($_SERVER['HTTP_HOST']) : + 'localhost'; + } + + /** + * Get request URI + * + * @access public + * @return string + */ + public function getRequestUri() + { + return array_key_exists('REQUEST_URI', $_SERVER) ? + htmlspecialchars( + parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH) + ) : '/'; + } + + /** + * If we are in a JSON API context + * + * @access public + * @return bool + */ + public function isJsonApiCall() + { + return $this->_isJsonApi; + } + + /** + * Override the default input stream source, used for unit testing + * + * @param string $input + */ + public static function setInputStream($input) + { + self::$_inputStream = $input; + } + + /** + * Detect the clients supported media type and decide if its a JSON API call or not + * + * Adapted from: https://stackoverflow.com/questions/3770513/detect-browser-language-in-php#3771447 + * + * @access private + * @return bool + */ + private function _detectJsonRequest() + { + $hasAcceptHeader = array_key_exists('HTTP_ACCEPT', $_SERVER); + $acceptHeader = $hasAcceptHeader ? $_SERVER['HTTP_ACCEPT'] : ''; + + // simple cases + if ( + (array_key_exists('HTTP_X_REQUESTED_WITH', $_SERVER) && + $_SERVER['HTTP_X_REQUESTED_WITH'] == 'JSONHttpRequest') || + ($hasAcceptHeader && + strpos($acceptHeader, self::MIME_JSON) !== false && + strpos($acceptHeader, self::MIME_HTML) === false && + strpos($acceptHeader, self::MIME_XHTML) === false) + ) { + return true; + } + + // advanced case: media type negotiation + $mediaTypes = array(); + if ($hasAcceptHeader) { + $mediaTypeRanges = explode(',', trim($acceptHeader)); + foreach ($mediaTypeRanges as $mediaTypeRange) { + if (preg_match( + '#(\*/\*|[a-z\-]+/[a-z\-+*]+(?:\s*;\s*[^q]\S*)*)(?:\s*;\s*q\s*=\s*(0(?:\.\d{0,3})|1(?:\.0{0,3})))?#', + trim($mediaTypeRange), $match + )) { + if (!isset($match[2])) { + $match[2] = '1.0'; + } else { + $match[2] = (string) floatval($match[2]); + } + if (!isset($mediaTypes[$match[2]])) { + $mediaTypes[$match[2]] = array(); + } + $mediaTypes[$match[2]][] = strtolower($match[1]); + } + } + krsort($mediaTypes); + foreach ($mediaTypes as $acceptedQuality => $acceptedValues) { + if ($acceptedQuality === 0.0) { + continue; + } + foreach ($acceptedValues as $acceptedValue) { + if ( + strpos($acceptedValue, self::MIME_HTML) === 0 || + strpos($acceptedValue, self::MIME_XHTML) === 0 + ) { + return false; + } elseif (strpos($acceptedValue, self::MIME_JSON) === 0) { + return true; + } + } + } + } + return false; + } +} diff --git a/lib/View.php b/lib/View.php new file mode 100644 index 00000000..34af280b --- /dev/null +++ b/lib/View.php @@ -0,0 +1,61 @@ +_variables[$name] = $value; + } + + /** + * render a template + * + * @access public + * @param string $template + * @throws Exception + */ + public function draw($template) + { + $file = substr($template, 0, 9) === 'bootstrap' ? 'bootstrap' : $template; + $path = PATH . 'tpl' . DIRECTORY_SEPARATOR . $file . '.php'; + if (!file_exists($path)) { + throw new Exception('Template ' . $template . ' not found!', 80); + } + extract($this->_variables); + include $path; + } +} diff --git a/lib/Vizhash16x16.php b/lib/Vizhash16x16.php new file mode 100644 index 00000000..f0ab26ab --- /dev/null +++ b/lib/Vizhash16x16.php @@ -0,0 +1,233 @@ +generate(sha512('hello')); + * header('Content-type: image/png'); + * echo $data; + * exit; + */ +class Vizhash16x16 +{ + /** + * hash values + * + * @access private + * @var array + */ + private $VALUES; + + /** + * index of current value + * + * @access private + * @var int + */ + private $VALUES_INDEX; + + /** + * image width + * + * @access private + * @var int + */ + private $width; + + /** + * image height + * + * @access private + * @var int + */ + private $height; + + /** + * constructor + * + * @access public + */ + public function __construct() + { + $this->width = 16; + $this->height = 16; + } + + /** + * Generate a 16x16 png corresponding to $text. + * + * The given text should to be 128 to 150 characters long + * + * @access public + * @param string $text + * @return string PNG data. Or empty string if GD is not available. + */ + public function generate($text) + { + if (!function_exists('gd_info')) { + return ''; + } + + $textlen = strlen($text); + + // We convert the hash into an array of integers. + $this->VALUES = array(); + for ($i = 0; $i < $textlen; $i = $i + 2) { + array_push($this->VALUES, hexdec(substr($text, $i, 2))); + } + $this->VALUES_INDEX = 0; // to walk the array. + + // Then use these integers to drive the creation of an image. + $image = imagecreatetruecolor($this->width, $this->height); + + $r = $r0 = $this->getInt(); + $g = $g0 = $this->getInt(); + $b = $b0 = $this->getInt(); + + // First, create an image with a specific gradient background. + $op = 'v'; + if (($this->getInt() % 2) == 0) { + $op = 'h'; + } + $image = $this->degrade($image, $op, array($r0, $g0, $b0), array(0, 0, 0)); + + for ($i = 0; $i < 7; ++$i) { + $action = $this->getInt(); + $color = imagecolorallocate($image, $r, $g, $b); + $r = $r0 = ($r0 + $this->getInt() / 25) % 256; + $g = $g0 = ($g0 + $this->getInt() / 25) % 256; + $b = $b0 = ($b0 + $this->getInt() / 25) % 256; + $this->drawshape($image, $action, $color); + } + + $color = imagecolorallocate($image, $this->getInt(), $this->getInt(), $this->getInt()); + $this->drawshape($image, $this->getInt(), $color); + ob_start(); + imagepng($image); + $imagedata = ob_get_contents(); + ob_end_clean(); + imagedestroy($image); + + return $imagedata; + } + + /** + * Returns a single integer from the $VALUES array (0...255) + * + * @access private + * @return int + */ + private function getInt() + { + $v = $this->VALUES[$this->VALUES_INDEX]; + ++$this->VALUES_INDEX; + $this->VALUES_INDEX %= count($this->VALUES); // Warp around the array + return $v; + } + + /** + * Returns a single integer from the array (roughly mapped to image width) + * + * @access private + * @return int + */ + private function getX() + { + return $this->width * $this->getInt() / 256; + } + + /** + * Returns a single integer from the array (roughly mapped to image height) + * + * @access private + * @return int + */ + private function getY() + { + return $this->height * $this->getInt() / 256; + } + + /** + * Gradient function + * + * taken from: + * http://www.supportduweb.com/scripts_tutoriaux-code-source-41-gd-faire-un-degrade-en-php-gd-fonction-degrade-imagerie.html + * + * @access private + * @param resource $img + * @param string $direction + * @param array $color1 + * @param array $color2 + * @return resource + */ + private function degrade($img, $direction, $color1, $color2) + { + if ($direction == 'h') { + $size = imagesx($img); + $sizeinv = imagesy($img); + } else { + $size = imagesy($img); + $sizeinv = imagesx($img); + } + $diffs = array( + (($color2[0] - $color1[0]) / $size), + (($color2[1] - $color1[1]) / $size), + (($color2[2] - $color1[2]) / $size), + ); + for ($i = 0; $i < $size; ++$i) { + $r = $color1[0] + ($diffs[0] * $i); + $g = $color1[1] + ($diffs[1] * $i); + $b = $color1[2] + ($diffs[2] * $i); + if ($direction == 'h') { + imageline($img, $i, 0, $i, $sizeinv, imagecolorallocate($img, $r, $g, $b)); + } else { + imageline($img, 0, $i, $sizeinv, $i, imagecolorallocate($img, $r, $g, $b)); + } + } + return $img; + } + + /** + * Draw a shape + * + * @access private + * @param resource $image + * @param int $action + * @param int $color + */ + private function drawshape($image, $action, $color) + { + switch ($action % 7) { + case 0: + imagefilledrectangle($image, $this->getX(), $this->getY(), $this->getX(), $this->getY(), $color); + break; + case 1: + case 2: + imagefilledellipse($image, $this->getX(), $this->getY(), $this->getX(), $this->getY(), $color); + break; + case 3: + $points = array($this->getX(), $this->getY(), $this->getX(), $this->getY(), $this->getX(), $this->getY(), $this->getX(), $this->getY()); + imagefilledpolygon($image, $points, 4, $color); + break; + default: + $start = $this->getInt() * 360 / 256; + $end = $start + $this->getInt() * 180 / 256; + imagefilledarc($image, $this->getX(), $this->getY(), $this->getX(), $this->getY(), $start, $end, $color, IMG_ARC_PIE); + } + } +} diff --git a/manifest.json b/manifest.json new file mode 100644 index 00000000..d92382f3 --- /dev/null +++ b/manifest.json @@ -0,0 +1,17 @@ +{ + "name": "PrivateBin", + "icons": [ + { + "src": "img/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image\/png" + }, + { + "src": "img/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image\/png" + } + ], + "theme_color": "#ffe57e", + "display": "standalone" +} diff --git a/robots.txt b/robots.txt new file mode 100644 index 00000000..7aa8150f --- /dev/null +++ b/robots.txt @@ -0,0 +1,8 @@ +# "A robots.txt a day keeps the robots away." +# (for performance and privacy reasons) +# +# Note: To be effective this robots.txt must be put into the root of your server +# directory. + +User-agent: * +Disallow: / diff --git a/tpl/.htaccess b/tpl/.htaccess new file mode 100644 index 00000000..b66e8088 --- /dev/null +++ b/tpl/.htaccess @@ -0,0 +1 @@ +Require all denied diff --git a/tpl/bootstrap.php b/tpl/bootstrap.php new file mode 100644 index 00000000..a74e767b --- /dev/null +++ b/tpl/bootstrap.php @@ -0,0 +1,593 @@ + + + + + + + + + <?php echo I18n::_($NAME); ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + > + + + + + + +
+ + + + + + + + \ No newline at end of file diff --git a/tpl/page.php b/tpl/page.php new file mode 100644 index 00000000..865b0295 --- /dev/null +++ b/tpl/page.php @@ -0,0 +1,273 @@ + + + + + + + <?php echo I18n::_($NAME); ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ in the browser using 256 bits AES. More information on the project page.', I18n::_($NAME)); ?>
+ + +
+


+


+

+ + + + + + +
+
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ +
+ + + + + + + + + + +
+
+
+ +
+ + + + + + +
+ +
+ + diff --git a/vendor/.htaccess b/vendor/.htaccess new file mode 100644 index 00000000..b66e8088 --- /dev/null +++ b/vendor/.htaccess @@ -0,0 +1 @@ +Require all denied diff --git a/vendor/autoload.php b/vendor/autoload.php new file mode 100644 index 00000000..a1be3bcf --- /dev/null +++ b/vendor/autoload.php @@ -0,0 +1,7 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Autoload; + +/** + * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. + * + * $loader = new \Composer\Autoload\ClassLoader(); + * + * // register classes with namespaces + * $loader->add('Symfony\Component', __DIR__.'/component'); + * $loader->add('Symfony', __DIR__.'/framework'); + * + * // activate the autoloader + * $loader->register(); + * + * // to enable searching the include path (eg. for PEAR packages) + * $loader->setUseIncludePath(true); + * + * In this example, if you try to use a class in the Symfony\Component + * namespace or one of its children (Symfony\Component\Console for instance), + * the autoloader will first look for the class under the component/ + * directory, and it will then fallback to the framework/ directory if not + * found before giving up. + * + * This class is loosely based on the Symfony UniversalClassLoader. + * + * @author Fabien Potencier + * @author Jordi Boggiano + * @see http://www.php-fig.org/psr/psr-0/ + * @see http://www.php-fig.org/psr/psr-4/ + */ +class ClassLoader +{ + // PSR-4 + private $prefixLengthsPsr4 = array(); + private $prefixDirsPsr4 = array(); + private $fallbackDirsPsr4 = array(); + + // PSR-0 + private $prefixesPsr0 = array(); + private $fallbackDirsPsr0 = array(); + + private $useIncludePath = false; + private $classMap = array(); + private $classMapAuthoritative = false; + private $missingClasses = array(); + private $apcuPrefix; + + public function getPrefixes() + { + if (!empty($this->prefixesPsr0)) { + return call_user_func_array('array_merge', $this->prefixesPsr0); + } + + return array(); + } + + public function getPrefixesPsr4() + { + return $this->prefixDirsPsr4; + } + + public function getFallbackDirs() + { + return $this->fallbackDirsPsr0; + } + + public function getFallbackDirsPsr4() + { + return $this->fallbackDirsPsr4; + } + + public function getClassMap() + { + return $this->classMap; + } + + /** + * @param array $classMap Class to filename map + */ + public function addClassMap(array $classMap) + { + if ($this->classMap) { + $this->classMap = array_merge($this->classMap, $classMap); + } else { + $this->classMap = $classMap; + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, either + * appending or prepending to the ones previously set for this prefix. + * + * @param string $prefix The prefix + * @param array|string $paths The PSR-0 root directories + * @param bool $prepend Whether to prepend the directories + */ + public function add($prefix, $paths, $prepend = false) + { + if (!$prefix) { + if ($prepend) { + $this->fallbackDirsPsr0 = array_merge( + (array) $paths, + $this->fallbackDirsPsr0 + ); + } else { + $this->fallbackDirsPsr0 = array_merge( + $this->fallbackDirsPsr0, + (array) $paths + ); + } + + return; + } + + $first = $prefix[0]; + if (!isset($this->prefixesPsr0[$first][$prefix])) { + $this->prefixesPsr0[$first][$prefix] = (array) $paths; + + return; + } + if ($prepend) { + $this->prefixesPsr0[$first][$prefix] = array_merge( + (array) $paths, + $this->prefixesPsr0[$first][$prefix] + ); + } else { + $this->prefixesPsr0[$first][$prefix] = array_merge( + $this->prefixesPsr0[$first][$prefix], + (array) $paths + ); + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, either + * appending or prepending to the ones previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param array|string $paths The PSR-4 base directories + * @param bool $prepend Whether to prepend the directories + * + * @throws \InvalidArgumentException + */ + public function addPsr4($prefix, $paths, $prepend = false) + { + if (!$prefix) { + // Register directories for the root namespace. + if ($prepend) { + $this->fallbackDirsPsr4 = array_merge( + (array) $paths, + $this->fallbackDirsPsr4 + ); + } else { + $this->fallbackDirsPsr4 = array_merge( + $this->fallbackDirsPsr4, + (array) $paths + ); + } + } elseif (!isset($this->prefixDirsPsr4[$prefix])) { + // Register directories for a new namespace. + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = (array) $paths; + } elseif ($prepend) { + // Prepend directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + (array) $paths, + $this->prefixDirsPsr4[$prefix] + ); + } else { + // Append directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + $this->prefixDirsPsr4[$prefix], + (array) $paths + ); + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, + * replacing any others previously set for this prefix. + * + * @param string $prefix The prefix + * @param array|string $paths The PSR-0 base directories + */ + public function set($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr0 = (array) $paths; + } else { + $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, + * replacing any others previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param array|string $paths The PSR-4 base directories + * + * @throws \InvalidArgumentException + */ + public function setPsr4($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr4 = (array) $paths; + } else { + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = (array) $paths; + } + } + + /** + * Turns on searching the include path for class files. + * + * @param bool $useIncludePath + */ + public function setUseIncludePath($useIncludePath) + { + $this->useIncludePath = $useIncludePath; + } + + /** + * Can be used to check if the autoloader uses the include path to check + * for classes. + * + * @return bool + */ + public function getUseIncludePath() + { + return $this->useIncludePath; + } + + /** + * Turns off searching the prefix and fallback directories for classes + * that have not been registered with the class map. + * + * @param bool $classMapAuthoritative + */ + public function setClassMapAuthoritative($classMapAuthoritative) + { + $this->classMapAuthoritative = $classMapAuthoritative; + } + + /** + * Should class lookup fail if not found in the current class map? + * + * @return bool + */ + public function isClassMapAuthoritative() + { + return $this->classMapAuthoritative; + } + + /** + * APCu prefix to use to cache found/not-found classes, if the extension is enabled. + * + * @param string|null $apcuPrefix + */ + public function setApcuPrefix($apcuPrefix) + { + $this->apcuPrefix = function_exists('apcu_fetch') && ini_get('apc.enabled') ? $apcuPrefix : null; + } + + /** + * The APCu prefix in use, or null if APCu caching is not enabled. + * + * @return string|null + */ + public function getApcuPrefix() + { + return $this->apcuPrefix; + } + + /** + * Registers this instance as an autoloader. + * + * @param bool $prepend Whether to prepend the autoloader or not + */ + public function register($prepend = false) + { + spl_autoload_register(array($this, 'loadClass'), true, $prepend); + } + + /** + * Unregisters this instance as an autoloader. + */ + public function unregister() + { + spl_autoload_unregister(array($this, 'loadClass')); + } + + /** + * Loads the given class or interface. + * + * @param string $class The name of the class + * @return bool|null True if loaded, null otherwise + */ + public function loadClass($class) + { + if ($file = $this->findFile($class)) { + includeFile($file); + + return true; + } + } + + /** + * Finds the path to the file where the class is defined. + * + * @param string $class The name of the class + * + * @return string|false The path if found, false otherwise + */ + public function findFile($class) + { + // class map lookup + if (isset($this->classMap[$class])) { + return $this->classMap[$class]; + } + if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { + return false; + } + if (null !== $this->apcuPrefix) { + $file = apcu_fetch($this->apcuPrefix.$class, $hit); + if ($hit) { + return $file; + } + } + + $file = $this->findFileWithExtension($class, '.php'); + + // Search for Hack files if we are running on HHVM + if (false === $file && defined('HHVM_VERSION')) { + $file = $this->findFileWithExtension($class, '.hh'); + } + + if (null !== $this->apcuPrefix) { + apcu_add($this->apcuPrefix.$class, $file); + } + + if (false === $file) { + // Remember that this class does not exist. + $this->missingClasses[$class] = true; + } + + return $file; + } + + private function findFileWithExtension($class, $ext) + { + // PSR-4 lookup + $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; + + $first = $class[0]; + if (isset($this->prefixLengthsPsr4[$first])) { + $subPath = $class; + while (false !== $lastPos = strrpos($subPath, '\\')) { + $subPath = substr($subPath, 0, $lastPos); + $search = $subPath.'\\'; + if (isset($this->prefixDirsPsr4[$search])) { + $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); + foreach ($this->prefixDirsPsr4[$search] as $dir) { + if (file_exists($file = $dir . $pathEnd)) { + return $file; + } + } + } + } + } + + // PSR-4 fallback dirs + foreach ($this->fallbackDirsPsr4 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { + return $file; + } + } + + // PSR-0 lookup + if (false !== $pos = strrpos($class, '\\')) { + // namespaced class name + $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) + . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); + } else { + // PEAR-like class name + $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; + } + + if (isset($this->prefixesPsr0[$first])) { + foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { + if (0 === strpos($class, $prefix)) { + foreach ($dirs as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + } + } + } + + // PSR-0 fallback dirs + foreach ($this->fallbackDirsPsr0 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + + // PSR-0 include paths. + if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { + return $file; + } + + return false; + } +} + +/** + * Scope isolated include. + * + * Prevents access to $this/self from included files. + */ +function includeFile($file) +{ + include $file; +} diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php new file mode 100644 index 00000000..b98b672f --- /dev/null +++ b/vendor/composer/autoload_classmap.php @@ -0,0 +1,36 @@ + $vendorDir . '/yzalis/identicon/src/Identicon/Generator/BaseGenerator.php', + 'Identicon\\Generator\\GdGenerator' => $vendorDir . '/yzalis/identicon/src/Identicon/Generator/GdGenerator.php', + 'Identicon\\Generator\\GeneratorInterface' => $vendorDir . '/yzalis/identicon/src/Identicon/Generator/GeneratorInterface.php', + 'Identicon\\Generator\\ImageMagickGenerator' => $vendorDir . '/yzalis/identicon/src/Identicon/Generator/ImageMagickGenerator.php', + 'Identicon\\Generator\\SvgGenerator' => $vendorDir . '/yzalis/identicon/src/Identicon/Generator/SvgGenerator.php', + 'Identicon\\Identicon' => $vendorDir . '/yzalis/identicon/src/Identicon/Identicon.php', + 'PrivateBin\\Configuration' => $baseDir . '/lib/Configuration.php', + 'PrivateBin\\Controller' => $baseDir . '/lib/Controller.php', + 'PrivateBin\\Data\\AbstractData' => $baseDir . '/lib/Data/AbstractData.php', + 'PrivateBin\\Data\\Database' => $baseDir . '/lib/Data/Database.php', + 'PrivateBin\\Data\\Filesystem' => $baseDir . '/lib/Data/Filesystem.php', + 'PrivateBin\\Filter' => $baseDir . '/lib/Filter.php', + 'PrivateBin\\FormatV2' => $baseDir . '/lib/FormatV2.php', + 'PrivateBin\\I18n' => $baseDir . '/lib/I18n.php', + 'PrivateBin\\Json' => $baseDir . '/lib/Json.php', + 'PrivateBin\\Model' => $baseDir . '/lib/Model.php', + 'PrivateBin\\Model\\AbstractModel' => $baseDir . '/lib/Model/AbstractModel.php', + 'PrivateBin\\Model\\Comment' => $baseDir . '/lib/Model/Comment.php', + 'PrivateBin\\Model\\Paste' => $baseDir . '/lib/Model/Paste.php', + 'PrivateBin\\Persistence\\AbstractPersistence' => $baseDir . '/lib/Persistence/AbstractPersistence.php', + 'PrivateBin\\Persistence\\DataStore' => $baseDir . '/lib/Persistence/DataStore.php', + 'PrivateBin\\Persistence\\PurgeLimiter' => $baseDir . '/lib/Persistence/PurgeLimiter.php', + 'PrivateBin\\Persistence\\ServerSalt' => $baseDir . '/lib/Persistence/ServerSalt.php', + 'PrivateBin\\Persistence\\TrafficLimiter' => $baseDir . '/lib/Persistence/TrafficLimiter.php', + 'PrivateBin\\Request' => $baseDir . '/lib/Request.php', + 'PrivateBin\\View' => $baseDir . '/lib/View.php', + 'PrivateBin\\Vizhash16x16' => $baseDir . '/lib/Vizhash16x16.php', +); diff --git a/vendor/composer/autoload_files.php b/vendor/composer/autoload_files.php new file mode 100644 index 00000000..4d80bcb5 --- /dev/null +++ b/vendor/composer/autoload_files.php @@ -0,0 +1,10 @@ + $vendorDir . '/paragonie/random_compat/lib/random.php', +); diff --git a/vendor/composer/autoload_namespaces.php b/vendor/composer/autoload_namespaces.php new file mode 100644 index 00000000..b7fc0125 --- /dev/null +++ b/vendor/composer/autoload_namespaces.php @@ -0,0 +1,9 @@ + array($baseDir . '/lib'), + 'Identicon\\' => array($vendorDir . '/yzalis/identicon/src/Identicon'), +); diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php new file mode 100644 index 00000000..2e234b96 --- /dev/null +++ b/vendor/composer/autoload_real.php @@ -0,0 +1,70 @@ += 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); + if ($useStaticLoader) { + require_once __DIR__ . '/autoload_static.php'; + + call_user_func(\Composer\Autoload\ComposerStaticInitDontChange::getInitializer($loader)); + } else { + $map = require __DIR__ . '/autoload_namespaces.php'; + foreach ($map as $namespace => $path) { + $loader->set($namespace, $path); + } + + $map = require __DIR__ . '/autoload_psr4.php'; + foreach ($map as $namespace => $path) { + $loader->setPsr4($namespace, $path); + } + + $classMap = require __DIR__ . '/autoload_classmap.php'; + if ($classMap) { + $loader->addClassMap($classMap); + } + } + + $loader->register(true); + + if ($useStaticLoader) { + $includeFiles = Composer\Autoload\ComposerStaticInitDontChange::$files; + } else { + $includeFiles = require __DIR__ . '/autoload_files.php'; + } + foreach ($includeFiles as $fileIdentifier => $file) { + composerRequireDontChange($fileIdentifier, $file); + } + + return $loader; + } +} + +function composerRequireDontChange($fileIdentifier, $file) +{ + if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { + require $file; + + $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; + } +} diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php new file mode 100644 index 00000000..604d6bba --- /dev/null +++ b/vendor/composer/autoload_static.php @@ -0,0 +1,74 @@ + __DIR__ . '/..' . '/paragonie/random_compat/lib/random.php', + ); + + public static $prefixLengthsPsr4 = array ( + 'P' => + array ( + 'PrivateBin\\' => 11, + ), + 'I' => + array ( + 'Identicon\\' => 10, + ), + ); + + public static $prefixDirsPsr4 = array ( + 'PrivateBin\\' => + array ( + 0 => __DIR__ . '/../..' . '/lib', + ), + 'Identicon\\' => + array ( + 0 => __DIR__ . '/..' . '/yzalis/identicon/src/Identicon', + ), + ); + + public static $classMap = array ( + 'Identicon\\Generator\\BaseGenerator' => __DIR__ . '/..' . '/yzalis/identicon/src/Identicon/Generator/BaseGenerator.php', + 'Identicon\\Generator\\GdGenerator' => __DIR__ . '/..' . '/yzalis/identicon/src/Identicon/Generator/GdGenerator.php', + 'Identicon\\Generator\\GeneratorInterface' => __DIR__ . '/..' . '/yzalis/identicon/src/Identicon/Generator/GeneratorInterface.php', + 'Identicon\\Generator\\ImageMagickGenerator' => __DIR__ . '/..' . '/yzalis/identicon/src/Identicon/Generator/ImageMagickGenerator.php', + 'Identicon\\Generator\\SvgGenerator' => __DIR__ . '/..' . '/yzalis/identicon/src/Identicon/Generator/SvgGenerator.php', + 'Identicon\\Identicon' => __DIR__ . '/..' . '/yzalis/identicon/src/Identicon/Identicon.php', + 'PrivateBin\\Configuration' => __DIR__ . '/../..' . '/lib/Configuration.php', + 'PrivateBin\\Controller' => __DIR__ . '/../..' . '/lib/Controller.php', + 'PrivateBin\\Data\\AbstractData' => __DIR__ . '/../..' . '/lib/Data/AbstractData.php', + 'PrivateBin\\Data\\Database' => __DIR__ . '/../..' . '/lib/Data/Database.php', + 'PrivateBin\\Data\\Filesystem' => __DIR__ . '/../..' . '/lib/Data/Filesystem.php', + 'PrivateBin\\Filter' => __DIR__ . '/../..' . '/lib/Filter.php', + 'PrivateBin\\FormatV2' => __DIR__ . '/../..' . '/lib/FormatV2.php', + 'PrivateBin\\I18n' => __DIR__ . '/../..' . '/lib/I18n.php', + 'PrivateBin\\Json' => __DIR__ . '/../..' . '/lib/Json.php', + 'PrivateBin\\Model' => __DIR__ . '/../..' . '/lib/Model.php', + 'PrivateBin\\Model\\AbstractModel' => __DIR__ . '/../..' . '/lib/Model/AbstractModel.php', + 'PrivateBin\\Model\\Comment' => __DIR__ . '/../..' . '/lib/Model/Comment.php', + 'PrivateBin\\Model\\Paste' => __DIR__ . '/../..' . '/lib/Model/Paste.php', + 'PrivateBin\\Persistence\\AbstractPersistence' => __DIR__ . '/../..' . '/lib/Persistence/AbstractPersistence.php', + 'PrivateBin\\Persistence\\DataStore' => __DIR__ . '/../..' . '/lib/Persistence/DataStore.php', + 'PrivateBin\\Persistence\\PurgeLimiter' => __DIR__ . '/../..' . '/lib/Persistence/PurgeLimiter.php', + 'PrivateBin\\Persistence\\ServerSalt' => __DIR__ . '/../..' . '/lib/Persistence/ServerSalt.php', + 'PrivateBin\\Persistence\\TrafficLimiter' => __DIR__ . '/../..' . '/lib/Persistence/TrafficLimiter.php', + 'PrivateBin\\Request' => __DIR__ . '/../..' . '/lib/Request.php', + 'PrivateBin\\View' => __DIR__ . '/../..' . '/lib/View.php', + 'PrivateBin\\Vizhash16x16' => __DIR__ . '/../..' . '/lib/Vizhash16x16.php', + ); + + public static function getInitializer(ClassLoader $loader) + { + return \Closure::bind(function () use ($loader) { + $loader->prefixLengthsPsr4 = ComposerStaticInitDontChange::$prefixLengthsPsr4; + $loader->prefixDirsPsr4 = ComposerStaticInitDontChange::$prefixDirsPsr4; + $loader->classMap = ComposerStaticInitDontChange::$classMap; + + }, null, ClassLoader::class); + } +} diff --git a/vendor/paragonie/random_compat/lib/byte_safe_strings.php b/vendor/paragonie/random_compat/lib/byte_safe_strings.php new file mode 100644 index 00000000..ef24488f --- /dev/null +++ b/vendor/paragonie/random_compat/lib/byte_safe_strings.php @@ -0,0 +1,195 @@ + RandomCompat_strlen($binary_string)) { + return ''; + } + + return (string) mb_substr( + (string) $binary_string, + (int) $start, + (int) $length, + '8bit' + ); + } + + } else { + + /** + * substr() implementation that isn't brittle to mbstring.func_overload + * + * This version just uses the default substr() + * + * @param string $binary_string + * @param int $start + * @param int|null $length (optional) + * + * @throws TypeError + * + * @return string + */ + function RandomCompat_substr($binary_string, $start, $length = null) + { + if (!is_string($binary_string)) { + throw new TypeError( + 'RandomCompat_substr(): First argument should be a string' + ); + } + + if (!is_int($start)) { + throw new TypeError( + 'RandomCompat_substr(): Second argument should be an integer' + ); + } + + if ($length !== null) { + if (!is_int($length)) { + throw new TypeError( + 'RandomCompat_substr(): Third argument should be an integer, or omitted' + ); + } + + return (string) substr( + (string )$binary_string, + (int) $start, + (int) $length + ); + } + + return (string) substr( + (string) $binary_string, + (int) $start + ); + } + } +} diff --git a/vendor/paragonie/random_compat/lib/cast_to_int.php b/vendor/paragonie/random_compat/lib/cast_to_int.php new file mode 100644 index 00000000..1b1bbfe8 --- /dev/null +++ b/vendor/paragonie/random_compat/lib/cast_to_int.php @@ -0,0 +1,77 @@ + operators might accidentally let a float + * through. + * + * @param int|float $number The number we want to convert to an int + * @param bool $fail_open Set to true to not throw an exception + * + * @return float|int + * @psalm-suppress InvalidReturnType + * + * @throws TypeError + */ + function RandomCompat_intval($number, $fail_open = false) + { + if (is_int($number) || is_float($number)) { + $number += 0; + } elseif (is_numeric($number)) { + /** @psalm-suppress InvalidOperand */ + $number += 0; + } + /** @var int|float $number */ + + if ( + is_float($number) + && + $number > ~PHP_INT_MAX + && + $number < PHP_INT_MAX + ) { + $number = (int) $number; + } + + if (is_int($number)) { + return (int) $number; + } elseif (!$fail_open) { + throw new TypeError( + 'Expected an integer.' + ); + } + return $number; + } +} diff --git a/vendor/paragonie/random_compat/lib/error_polyfill.php b/vendor/paragonie/random_compat/lib/error_polyfill.php new file mode 100644 index 00000000..c02c5c8b --- /dev/null +++ b/vendor/paragonie/random_compat/lib/error_polyfill.php @@ -0,0 +1,49 @@ += 70000) { + return; +} + +if (!defined('RANDOM_COMPAT_READ_BUFFER')) { + define('RANDOM_COMPAT_READ_BUFFER', 8); +} + +$RandomCompatDIR = dirname(__FILE__); + +require_once $RandomCompatDIR . DIRECTORY_SEPARATOR . 'byte_safe_strings.php'; +require_once $RandomCompatDIR . DIRECTORY_SEPARATOR . 'cast_to_int.php'; +require_once $RandomCompatDIR . DIRECTORY_SEPARATOR . 'error_polyfill.php'; + +if (!is_callable('random_bytes')) { + /** + * PHP 5.2.0 - 5.6.x way to implement random_bytes() + * + * We use conditional statements here to define the function in accordance + * to the operating environment. It's a micro-optimization. + * + * In order of preference: + * 1. Use libsodium if available. + * 2. fread() /dev/urandom if available (never on Windows) + * 3. mcrypt_create_iv($bytes, MCRYPT_DEV_URANDOM) + * 4. COM('CAPICOM.Utilities.1')->GetRandom() + * + * See RATIONALE.md for our reasoning behind this particular order + */ + if (extension_loaded('libsodium')) { + // See random_bytes_libsodium.php + if (PHP_VERSION_ID >= 50300 && is_callable('\\Sodium\\randombytes_buf')) { + require_once $RandomCompatDIR . DIRECTORY_SEPARATOR . 'random_bytes_libsodium.php'; + } elseif (method_exists('Sodium', 'randombytes_buf')) { + require_once $RandomCompatDIR . DIRECTORY_SEPARATOR . 'random_bytes_libsodium_legacy.php'; + } + } + + /** + * Reading directly from /dev/urandom: + */ + if (DIRECTORY_SEPARATOR === '/') { + // DIRECTORY_SEPARATOR === '/' on Unix-like OSes -- this is a fast + // way to exclude Windows. + $RandomCompatUrandom = true; + $RandomCompat_basedir = ini_get('open_basedir'); + + if (!empty($RandomCompat_basedir)) { + $RandomCompat_open_basedir = explode( + PATH_SEPARATOR, + strtolower($RandomCompat_basedir) + ); + $RandomCompatUrandom = (array() !== array_intersect( + array('/dev', '/dev/', '/dev/urandom'), + $RandomCompat_open_basedir + )); + $RandomCompat_open_basedir = null; + } + + if ( + !is_callable('random_bytes') + && + $RandomCompatUrandom + && + @is_readable('/dev/urandom') + ) { + // Error suppression on is_readable() in case of an open_basedir + // or safe_mode failure. All we care about is whether or not we + // can read it at this point. If the PHP environment is going to + // panic over trying to see if the file can be read in the first + // place, that is not helpful to us here. + + // See random_bytes_dev_urandom.php + require_once $RandomCompatDIR . DIRECTORY_SEPARATOR . 'random_bytes_dev_urandom.php'; + } + // Unset variables after use + $RandomCompat_basedir = null; + } else { + $RandomCompatUrandom = false; + } + + /** + * mcrypt_create_iv() + * + * We only want to use mcypt_create_iv() if: + * + * - random_bytes() hasn't already been defined + * - the mcrypt extensions is loaded + * - One of these two conditions is true: + * - We're on Windows (DIRECTORY_SEPARATOR !== '/') + * - We're not on Windows and /dev/urandom is readabale + * (i.e. we're not in a chroot jail) + * - Special case: + * - If we're not on Windows, but the PHP version is between + * 5.6.10 and 5.6.12, we don't want to use mcrypt. It will + * hang indefinitely. This is bad. + * - If we're on Windows, we want to use PHP >= 5.3.7 or else + * we get insufficient entropy errors. + */ + if ( + !is_callable('random_bytes') + && + // Windows on PHP < 5.3.7 is broken, but non-Windows is not known to be. + (DIRECTORY_SEPARATOR === '/' || PHP_VERSION_ID >= 50307) + && + // Prevent this code from hanging indefinitely on non-Windows; + // see https://bugs.php.net/bug.php?id=69833 + ( + DIRECTORY_SEPARATOR !== '/' || + (PHP_VERSION_ID <= 50609 || PHP_VERSION_ID >= 50613) + ) + && + extension_loaded('mcrypt') + ) { + // See random_bytes_mcrypt.php + require_once $RandomCompatDIR . DIRECTORY_SEPARATOR . 'random_bytes_mcrypt.php'; + } + $RandomCompatUrandom = null; + + /** + * This is a Windows-specific fallback, for when the mcrypt extension + * isn't loaded. + */ + if ( + !is_callable('random_bytes') + && + extension_loaded('com_dotnet') + && + class_exists('COM') + ) { + $RandomCompat_disabled_classes = preg_split( + '#\s*,\s*#', + strtolower(ini_get('disable_classes')) + ); + + if (!in_array('com', $RandomCompat_disabled_classes)) { + try { + $RandomCompatCOMtest = new COM('CAPICOM.Utilities.1'); + if (method_exists($RandomCompatCOMtest, 'GetRandom')) { + // See random_bytes_com_dotnet.php + require_once $RandomCompatDIR . DIRECTORY_SEPARATOR . 'random_bytes_com_dotnet.php'; + } + } catch (com_exception $e) { + // Don't try to use it. + } + } + $RandomCompat_disabled_classes = null; + $RandomCompatCOMtest = null; + } + + /** + * throw new Exception + */ + if (!is_callable('random_bytes')) { + /** + * We don't have any more options, so let's throw an exception right now + * and hope the developer won't let it fail silently. + * + * @param mixed $length + * @psalm-suppress InvalidReturnType + * @throws Exception + * @return string + */ + function random_bytes($length) + { + unset($length); // Suppress "variable not used" warnings. + throw new Exception( + 'There is no suitable CSPRNG installed on your system' + ); + return ''; + } + } +} + +if (!is_callable('random_int')) { + require_once $RandomCompatDIR . DIRECTORY_SEPARATOR . 'random_int.php'; +} + +$RandomCompatDIR = null; diff --git a/vendor/paragonie/random_compat/lib/random_bytes_com_dotnet.php b/vendor/paragonie/random_compat/lib/random_bytes_com_dotnet.php new file mode 100644 index 00000000..537d02b2 --- /dev/null +++ b/vendor/paragonie/random_compat/lib/random_bytes_com_dotnet.php @@ -0,0 +1,91 @@ +GetRandom($bytes, 0)); + if (RandomCompat_strlen($buf) >= $bytes) { + /** + * Return our random entropy buffer here: + */ + return (string) RandomCompat_substr($buf, 0, $bytes); + } + ++$execCount; + } while ($execCount < $bytes); + + /** + * If we reach here, PHP has failed us. + */ + throw new Exception( + 'Could not gather sufficient random data' + ); + } +} diff --git a/vendor/paragonie/random_compat/lib/random_bytes_dev_urandom.php b/vendor/paragonie/random_compat/lib/random_bytes_dev_urandom.php new file mode 100644 index 00000000..c4e31ccb --- /dev/null +++ b/vendor/paragonie/random_compat/lib/random_bytes_dev_urandom.php @@ -0,0 +1,190 @@ + $st */ + $st = fstat($fp); + if (($st['mode'] & 0170000) !== 020000) { + fclose($fp); + $fp = false; + } + } + } + + if (is_resource($fp)) { + /** + * stream_set_read_buffer() does not exist in HHVM + * + * If we don't set the stream's read buffer to 0, PHP will + * internally buffer 8192 bytes, which can waste entropy + * + * stream_set_read_buffer returns 0 on success + */ + if (is_callable('stream_set_read_buffer')) { + stream_set_read_buffer($fp, RANDOM_COMPAT_READ_BUFFER); + } + if (is_callable('stream_set_chunk_size')) { + stream_set_chunk_size($fp, RANDOM_COMPAT_READ_BUFFER); + } + } + } + + try { + /** @var int $bytes */ + $bytes = RandomCompat_intval($bytes); + } catch (TypeError $ex) { + throw new TypeError( + 'random_bytes(): $bytes must be an integer' + ); + } + + if ($bytes < 1) { + throw new Error( + 'Length must be greater than 0' + ); + } + + /** + * This if() block only runs if we managed to open a file handle + * + * It does not belong in an else {} block, because the above + * if (empty($fp)) line is logic that should only be run once per + * page load. + */ + if (is_resource($fp)) { + /** + * @var int + */ + $remaining = $bytes; + + /** + * @var string|bool + */ + $buf = ''; + + /** + * We use fread() in a loop to protect against partial reads + */ + do { + /** + * @var string|bool + */ + $read = fread($fp, $remaining); + if (!is_string($read)) { + /** + * We cannot safely read from the file. Exit the + * do-while loop and trigger the exception condition + * + * @var string|bool + */ + $buf = false; + break; + } + /** + * Decrease the number of bytes returned from remaining + */ + $remaining -= RandomCompat_strlen($read); + /** + * @var string $buf + */ + $buf .= $read; + } while ($remaining > 0); + + /** + * Is our result valid? + * @var string|bool $buf + */ + if (is_string($buf)) { + if (RandomCompat_strlen($buf) === $bytes) { + /** + * Return our random entropy buffer here: + */ + return $buf; + } + } + } + + /** + * If we reach here, PHP has failed us. + */ + throw new Exception( + 'Error reading from source device' + ); + } +} diff --git a/vendor/paragonie/random_compat/lib/random_bytes_libsodium.php b/vendor/paragonie/random_compat/lib/random_bytes_libsodium.php new file mode 100644 index 00000000..2e562901 --- /dev/null +++ b/vendor/paragonie/random_compat/lib/random_bytes_libsodium.php @@ -0,0 +1,91 @@ + 2147483647) { + $buf = ''; + for ($i = 0; $i < $bytes; $i += 1073741824) { + $n = ($bytes - $i) > 1073741824 + ? 1073741824 + : $bytes - $i; + $buf .= \Sodium\randombytes_buf($n); + } + } else { + /** @var string|bool $buf */ + $buf = \Sodium\randombytes_buf($bytes); + } + + if (is_string($buf)) { + if (RandomCompat_strlen($buf) === $bytes) { + return $buf; + } + } + + /** + * If we reach here, PHP has failed us. + */ + throw new Exception( + 'Could not gather sufficient random data' + ); + } +} diff --git a/vendor/paragonie/random_compat/lib/random_bytes_libsodium_legacy.php b/vendor/paragonie/random_compat/lib/random_bytes_libsodium_legacy.php new file mode 100644 index 00000000..f78b2199 --- /dev/null +++ b/vendor/paragonie/random_compat/lib/random_bytes_libsodium_legacy.php @@ -0,0 +1,93 @@ + 2147483647) { + for ($i = 0; $i < $bytes; $i += 1073741824) { + $n = ($bytes - $i) > 1073741824 + ? 1073741824 + : $bytes - $i; + $buf .= Sodium::randombytes_buf((int) $n); + } + } else { + $buf .= Sodium::randombytes_buf((int) $bytes); + } + + if (is_string($buf)) { + if (RandomCompat_strlen($buf) === $bytes) { + return $buf; + } + } + + /** + * If we reach here, PHP has failed us. + */ + throw new Exception( + 'Could not gather sufficient random data' + ); + } +} diff --git a/vendor/paragonie/random_compat/lib/random_bytes_mcrypt.php b/vendor/paragonie/random_compat/lib/random_bytes_mcrypt.php new file mode 100644 index 00000000..0b13fa73 --- /dev/null +++ b/vendor/paragonie/random_compat/lib/random_bytes_mcrypt.php @@ -0,0 +1,79 @@ + operators might accidentally let a float + * through. + */ + + try { + /** @var int $min */ + $min = RandomCompat_intval($min); + } catch (TypeError $ex) { + throw new TypeError( + 'random_int(): $min must be an integer' + ); + } + + try { + /** @var int $max */ + $max = RandomCompat_intval($max); + } catch (TypeError $ex) { + throw new TypeError( + 'random_int(): $max must be an integer' + ); + } + + /** + * Now that we've verified our weak typing system has given us an integer, + * let's validate the logic then we can move forward with generating random + * integers along a given range. + */ + if ($min > $max) { + throw new Error( + 'Minimum value must be less than or equal to the maximum value' + ); + } + + if ($max === $min) { + return (int) $min; + } + + /** + * Initialize variables to 0 + * + * We want to store: + * $bytes => the number of random bytes we need + * $mask => an integer bitmask (for use with the &) operator + * so we can minimize the number of discards + */ + $attempts = $bits = $bytes = $mask = $valueShift = 0; + /** @var int $attempts */ + /** @var int $bits */ + /** @var int $bytes */ + /** @var int $mask */ + /** @var int $valueShift */ + + /** + * At this point, $range is a positive number greater than 0. It might + * overflow, however, if $max - $min > PHP_INT_MAX. PHP will cast it to + * a float and we will lose some precision. + * + * @var int|float $range + */ + $range = $max - $min; + + /** + * Test for integer overflow: + */ + if (!is_int($range)) { + + /** + * Still safely calculate wider ranges. + * Provided by @CodesInChaos, @oittaa + * + * @ref https://gist.github.com/CodesInChaos/03f9ea0b58e8b2b8d435 + * + * We use ~0 as a mask in this case because it generates all 1s + * + * @ref https://eval.in/400356 (32-bit) + * @ref http://3v4l.org/XX9r5 (64-bit) + */ + $bytes = PHP_INT_SIZE; + /** @var int $mask */ + $mask = ~0; + + } else { + + /** + * $bits is effectively ceil(log($range, 2)) without dealing with + * type juggling + */ + while ($range > 0) { + if ($bits % 8 === 0) { + ++$bytes; + } + ++$bits; + $range >>= 1; + /** @var int $mask */ + $mask = $mask << 1 | 1; + } + $valueShift = $min; + } + + /** @var int $val */ + $val = 0; + /** + * Now that we have our parameters set up, let's begin generating + * random integers until one falls between $min and $max + */ + /** @psalm-suppress RedundantCondition */ + do { + /** + * The rejection probability is at most 0.5, so this corresponds + * to a failure probability of 2^-128 for a working RNG + */ + if ($attempts > 128) { + throw new Exception( + 'random_int: RNG is broken - too many rejections' + ); + } + + /** + * Let's grab the necessary number of random bytes + */ + $randomByteString = random_bytes($bytes); + + /** + * Let's turn $randomByteString into an integer + * + * This uses bitwise operators (<< and |) to build an integer + * out of the values extracted from ord() + * + * Example: [9F] | [6D] | [32] | [0C] => + * 159 + 27904 + 3276800 + 201326592 => + * 204631455 + */ + $val &= 0; + for ($i = 0; $i < $bytes; ++$i) { + $val |= ord($randomByteString[$i]) << ($i * 8); + } + /** @var int $val */ + + /** + * Apply mask + */ + $val &= $mask; + $val += $valueShift; + + ++$attempts; + /** + * If $val overflows to a floating point number, + * ... or is larger than $max, + * ... or smaller than $min, + * then try again. + */ + } while (!is_int($val) || $val > $max || $val < $min); + + return (int) $val; + } +} diff --git a/vendor/yzalis/identicon/src/Identicon/Generator/BaseGenerator.php b/vendor/yzalis/identicon/src/Identicon/Generator/BaseGenerator.php new file mode 100644 index 00000000..fa280eb2 --- /dev/null +++ b/vendor/yzalis/identicon/src/Identicon/Generator/BaseGenerator.php @@ -0,0 +1,250 @@ + + */ +class BaseGenerator +{ + /** + * @var mixed + */ + protected $generatedImage; + + /** + * @var array + */ + protected $color; + + /** + * @var array + */ + protected $backgroundColor; + + /** + * @var int + */ + protected $size; + + /** + * @var int + */ + protected $pixelRatio; + + /** + * @var string + */ + private $hash; + + /** + * @var array + */ + private $arrayOfSquare = []; + + /** + * Set the image color. + * + * @param string|array $color The color in hexa (3 or 6 chars) or rgb array + * + * @return $this + */ + public function setColor($color) + { + if (null === $color) { + return $this; + } + + $this->color = $this->convertColor($color); + + return $this; + } + + /** + * Set the image background color. + * + * @param string|array $backgroundColor The color in hexa (3 or 6 chars) or rgb array + * + * @return $this + */ + public function setBackgroundColor($backgroundColor) + { + if (null === $backgroundColor) { + return $this; + } + + $this->backgroundColor = $this->convertColor($backgroundColor); + + return $this; + } + + /** + * @param array|string $color + * + * @return array + */ + private function convertColor($color) + { + if (is_array($color)) { + return $color; + } + + if (preg_match('/^#?([a-z\d])([a-z\d])([a-z\d])$/i', $color, $matches)) { + $color = $matches[1].$matches[1]; + $color .= $matches[2].$matches[2]; + $color .= $matches[3].$matches[3]; + } + + preg_match('/#?([a-z\d]{2})([a-z\d]{2})([a-z\d]{2})$/i', $color, $matches); + + return array_map(function ($value) { + return hexdec($value); + }, array_slice($matches, 1, 3)); + } + + /** + * Get the color. + * + * @return array + */ + public function getColor() + { + return $this->color; + } + + /** + * Get the background color. + * + * @return array + */ + public function getBackgroundColor() + { + return $this->backgroundColor; + } + + /** + * Convert the hash into an multidimensional array of boolean. + * + * @return $this + */ + private function convertHashToArrayOfBoolean() + { + preg_match_all('/(\w)(\w)/', $this->hash, $chars); + + foreach ($chars[1] as $i => $char) { + $index = (int) ($i / 3); + $data = $this->convertHexaToBoolean($char); + + $items = [ + 0 => [0, 4], + 1 => [1, 3], + 2 => [2], + ]; + + foreach ($items[$i % 3] as $item) { + $this->arrayOfSquare[$index][$item] = $data; + } + + ksort($this->arrayOfSquare[$index]); + } + + $this->color = array_map(function ($data) { + return hexdec($data) * 16; + }, array_reverse($chars[1])); + + return $this; + } + + /** + * Convert an hexadecimal number into a boolean. + * + * @param string $hexa + * + * @return bool + */ + private function convertHexaToBoolean($hexa) + { + return (bool) round(hexdec($hexa) / 10); + } + + /** + * @return array + */ + public function getArrayOfSquare() + { + return $this->arrayOfSquare; + } + + /** + * Get the identicon string hash. + * + * @return string + */ + public function getHash() + { + return $this->hash; + } + + /** + * Generate a hash from the original string. + * + * @param string $string + * + * @throws \Exception + * + * @return $this + */ + public function setString($string) + { + if (null === $string) { + throw new Exception('The string cannot be null.'); + } + + $this->hash = md5($string); + + $this->convertHashToArrayOfBoolean(); + + return $this; + } + + /** + * Set the image size. + * + * @param int $size + * + * @return $this + */ + public function setSize($size) + { + if (null === $size) { + return $this; + } + + $this->size = $size; + $this->pixelRatio = (int) round($size / 5); + + return $this; + } + + /** + * Get the image size. + * + * @return int + */ + public function getSize() + { + return $this->size; + } + + /** + * Get the pixel ratio. + * + * @return int + */ + public function getPixelRatio() + { + return $this->pixelRatio; + } +} diff --git a/vendor/yzalis/identicon/src/Identicon/Generator/GdGenerator.php b/vendor/yzalis/identicon/src/Identicon/Generator/GdGenerator.php new file mode 100644 index 00000000..21ea9221 --- /dev/null +++ b/vendor/yzalis/identicon/src/Identicon/Generator/GdGenerator.php @@ -0,0 +1,90 @@ + + */ +class GdGenerator extends BaseGenerator implements GeneratorInterface +{ + /** + * GdGenerator constructor. + */ + public function __construct() + { + if (!extension_loaded('gd') && !extension_loaded('ext-gd')) { + throw new Exception('GD does not appear to be available in your PHP installation. Please try another generator'); + } + } + + /** + * @return string + */ + public function getMimeType() + { + return 'image/png'; + } + + /** + * @return $this + */ + private function generateImage() + { + // prepare image + $this->generatedImage = imagecreatetruecolor($this->getPixelRatio() * 5, $this->getPixelRatio() * 5); + + $rgbBackgroundColor = $this->getBackgroundColor(); + if (null === $rgbBackgroundColor) { + $background = imagecolorallocate($this->generatedImage, 0, 0, 0); + imagecolortransparent($this->generatedImage, $background); + } else { + $background = imagecolorallocate($this->generatedImage, $rgbBackgroundColor[0], $rgbBackgroundColor[1], $rgbBackgroundColor[2]); + imagefill($this->generatedImage, 0, 0, $background); + } + + // prepare color + $rgbColor = $this->getColor(); + $gdColor = imagecolorallocate($this->generatedImage, $rgbColor[0], $rgbColor[1], $rgbColor[2]); + + // draw content + foreach ($this->getArrayOfSquare() as $lineKey => $lineValue) { + foreach ($lineValue as $colKey => $colValue) { + if (true === $colValue) { + imagefilledrectangle($this->generatedImage, $colKey * $this->getPixelRatio(), $lineKey * $this->getPixelRatio(), ($colKey + 1) * $this->getPixelRatio(), ($lineKey + 1) * $this->getPixelRatio(), $gdColor); + } + } + } + + return $this; + } + + /** + * {@inheritdoc} + */ + public function getImageBinaryData($string, $size = null, $color = null, $backgroundColor = null) + { + ob_start(); + imagepng($this->getImageResource($string, $size, $color, $backgroundColor)); + $imageData = ob_get_contents(); + ob_end_clean(); + + return $imageData; + } + + /** + * {@inheritdoc} + */ + public function getImageResource($string, $size = null, $color = null, $backgroundColor = null) + { + $this + ->setString($string) + ->setSize($size) + ->setColor($color) + ->setBackgroundColor($backgroundColor) + ->generateImage(); + + return $this->generatedImage; + } +} diff --git a/vendor/yzalis/identicon/src/Identicon/Generator/GeneratorInterface.php b/vendor/yzalis/identicon/src/Identicon/Generator/GeneratorInterface.php new file mode 100644 index 00000000..c6e8e0e6 --- /dev/null +++ b/vendor/yzalis/identicon/src/Identicon/Generator/GeneratorInterface.php @@ -0,0 +1,43 @@ + + */ +interface GeneratorInterface +{ + /** + * @param string $string + * @param int $size + * @param array|string $color + * @param array|string $backgroundColor + * + * @return mixed + */ + public function getImageBinaryData($string, $size = null, $color = null, $backgroundColor = null); + + /** + * @param string $string + * @param int $size + * @param array|string $color + * @param array|string $backgroundColor + * + * @return string + */ + public function getImageResource($string, $size = null, $color = null, $backgroundColor = null); + + /** + * Return the mime-type of this identicon. + * + * @return string + */ + public function getMimeType(); + + /** + * Return the color of the created identicon. + * + * @return array + */ + public function getColor(); +} diff --git a/vendor/yzalis/identicon/src/Identicon/Generator/ImageMagickGenerator.php b/vendor/yzalis/identicon/src/Identicon/Generator/ImageMagickGenerator.php new file mode 100644 index 00000000..0bcd349b --- /dev/null +++ b/vendor/yzalis/identicon/src/Identicon/Generator/ImageMagickGenerator.php @@ -0,0 +1,98 @@ + + */ +class ImageMagickGenerator extends BaseGenerator implements GeneratorInterface +{ + /** + * ImageMagickGenerator constructor. + * + * @throws \Exception + */ + public function __construct() + { + if (!extension_loaded('imagick')) { + throw new Exception('ImageMagick does not appear to be avaliable in your PHP installation. Please try another generator'); + } + } + + /** + * @return string + */ + public function getMimeType() + { + return 'image/png'; + } + + /** + * @return $this + */ + private function generateImage() + { + $this->generatedImage = new \Imagick(); + $rgbBackgroundColor = $this->getBackgroundColor(); + + if (null === $rgbBackgroundColor) { + $background = 'none'; + } else { + $background = new ImagickPixel("rgb($rgbBackgroundColor[0],$rgbBackgroundColor[1],$rgbBackgroundColor[2])"); + } + + $this->generatedImage->newImage($this->pixelRatio * 5, $this->pixelRatio * 5, $background, 'png'); + + // prepare color + $rgbColor = $this->getColor(); + $color = new ImagickPixel("rgb($rgbColor[0],$rgbColor[1],$rgbColor[2])"); + + $draw = new ImagickDraw(); + $draw->setFillColor($color); + + // draw the content + foreach ($this->getArrayOfSquare() as $lineKey => $lineValue) { + foreach ($lineValue as $colKey => $colValue) { + if (true === $colValue) { + $draw->rectangle($colKey * $this->pixelRatio, $lineKey * $this->pixelRatio, ($colKey + 1) * $this->pixelRatio, ($lineKey + 1) * $this->pixelRatio); + } + } + } + + $this->generatedImage->drawImage($draw); + + return $this; + } + + /** + * {@inheritdoc} + */ + public function getImageBinaryData($string, $size = null, $color = null, $backgroundColor = null) + { + ob_start(); + echo $this->getImageResource($string, $size, $color, $backgroundColor); + $imageData = ob_get_contents(); + ob_end_clean(); + + return $imageData; + } + + /** + * {@inheritdoc} + */ + public function getImageResource($string, $size = null, $color = null, $backgroundColor = null) + { + $this + ->setString($string) + ->setSize($size) + ->setColor($color) + ->setBackgroundColor($backgroundColor) + ->generateImage(); + + return $this->generatedImage; + } +} diff --git a/vendor/yzalis/identicon/src/Identicon/Generator/SvgGenerator.php b/vendor/yzalis/identicon/src/Identicon/Generator/SvgGenerator.php new file mode 100644 index 00000000..d654a951 --- /dev/null +++ b/vendor/yzalis/identicon/src/Identicon/Generator/SvgGenerator.php @@ -0,0 +1,88 @@ + + */ +class SvgGenerator extends BaseGenerator implements GeneratorInterface +{ + /** + * {@inheritdoc} + */ + public function getMimeType() + { + return 'image/svg+xml'; + } + + /** + * {@inheritdoc} + */ + public function getImageBinaryData($string, $size = null, $color = null, $backgroundColor = null) + { + return $this->getImageResource($string, $size, $color, $backgroundColor); + } + + /** + * {@inheritdoc} + */ + public function getImageResource($string, $size = null, $color = null, $backgroundColor = null) + { + $this + ->setString($string) + ->setSize($size) + ->setColor($color) + ->setBackgroundColor($backgroundColor) + ->_generateImage(); + + return $this->generatedImage; + } + + /** + * @return $this + */ + protected function _generateImage() + { + // prepare image + $w = $this->getPixelRatio() * 5; + $h = $this->getPixelRatio() * 5; + $svg = ''; + + $backgroundColor = '#FFFFFF'; + $rgbBackgroundColor = $this->getBackgroundColor(); + if (!is_null($rgbBackgroundColor)) { + $backgroundColor = $this->_toUnderstandableColor($rgbBackgroundColor); + } + $svg .= ''; + + $rgbColor = $this->_toUnderstandableColor($this->getColor()); + // draw content + foreach ($this->getArrayOfSquare() as $lineKey => $lineValue) { + foreach ($lineValue as $colKey => $colValue) { + if (true === $colValue) { + $svg .= ''; + } + } + } + + $svg .= ''; + + $this->generatedImage = $svg; + + return $this; + } + + /** + * @param array|string $color + * + * @return string + */ + protected function _toUnderstandableColor($color) + { + if (is_array($color)) { + return 'rgb('.implode(', ', $color).')'; + } + + return $color; + } +} diff --git a/vendor/yzalis/identicon/src/Identicon/Identicon.php b/vendor/yzalis/identicon/src/Identicon/Identicon.php new file mode 100644 index 00000000..08d32f5e --- /dev/null +++ b/vendor/yzalis/identicon/src/Identicon/Identicon.php @@ -0,0 +1,123 @@ + + */ +class Identicon +{ + /** + * @var \Identicon\Generator\GeneratorInterface + */ + private $generator; + + /** + * Identicon constructor. + * + * @param \Identicon\Generator\GeneratorInterface|null $generator + */ + public function __construct($generator = null) + { + if (null === $generator) { + $this->generator = new GdGenerator(); + } else { + $this->generator = $generator; + } + } + + /** + * Set the image generator. + * + * @param \Identicon\Generator\GeneratorInterface $generator + * + * @return $this + */ + public function setGenerator(GeneratorInterface $generator) + { + $this->generator = $generator; + + return $this; + } + + /** + * Display an Identicon image. + * + * @param string $string + * @param int $size + * @param string $color + * @param string $backgroundColor + */ + public function displayImage($string, $size = 64, $color = null, $backgroundColor = null) + { + header('Content-Type: '.$this->generator->getMimeType()); + echo $this->getImageData($string, $size, $color, $backgroundColor); + } + + /** + * Get an Identicon PNG image data. + * + * @param string $string + * @param int $size + * @param string $color + * @param string $backgroundColor + * + * @return string + */ + public function getImageData($string, $size = 64, $color = null, $backgroundColor = null) + { + return $this->generator->getImageBinaryData($string, $size, $color, $backgroundColor); + } + + /** + * Get an Identicon PNG image resource. + * + * @param string $string + * @param int $size + * @param string $color + * @param string $backgroundColor + * + * @return string + */ + public function getImageResource($string, $size = 64, $color = null, $backgroundColor = null) + { + return $this->generator->getImageResource($string, $size, $color, $backgroundColor); + } + + /** + * Get an Identicon PNG image data as base 64 encoded. + * + * @param string $string + * @param int $size + * @param string $color + * @param string $backgroundColor + * + * @return string + */ + public function getImageDataUri($string, $size = 64, $color = null, $backgroundColor = null) + { + return sprintf('data:%s;base64,%s', $this->generator->getMimeType(), base64_encode($this->getImageData($string, $size, $color, $backgroundColor))); + } + + /** + * Get the color of the Identicon + * + * Returns an array with RGB values of the Identicon's color. Colors may be NULL if no image has been generated + * so far (e.g., when calling the method on a new Identicon()). + * + * @return array + */ + public function getColor() + { + $colors = $this->generator->getColor(); + + return [ + "r" => $colors[0], + "g" => $colors[1], + "b" => $colors[2] + ]; + } +}
+
+ + + + + + + + + + + + + + + + + +
+
+
+ + + + +

+
+
+
+ +
+
+ +
+
+
+

-

+

+

+ in the browser using 256 bits AES. More information on the project page.', I18n::_($NAME)), PHP_EOL; ?> +

+
+
+
-
- - - - - - - - - - - - - - -
-
-
- - - - -

-
-
-
- -
-
- -
-
-